`
jgsj
  • 浏览: 990827 次
文章分类
社区版块
存档分类
最新评论

堆排序的应用 Priority queues 优先级排序

 
阅读更多

堆排序很多时候的实际应用并不如快速排序(quick sort)那么快,但是也有很多实际的应用,例如优先级排序就是其中之一。

优先级排序可以应用到系统的调度算法中,人工智能中也经常要用到,熟悉这个算法很有好处。

不要让名字误导我们,优先级队列其实数据结构不一定就是一个普通的队列数据结构,这里的底层数据结构反而是堆,当然也可以使用其他数据结构实现。

Priority Queues应该是偏重于概念性的数据结构。

下面给出利用堆操作构建优先级排序的基本算法:

#include<iostream>
#include<vector>

#include"heapSort.h"
//包含了堆排序的操作,可以参照我博客的堆排序
using namespace std;

template<typename T>
T heapMax(const vector<T>& heap)
{
	return heap[0];
}

template<typename T>
T heapExtractMax(vector<T>& heap)
{
	if(heap.size()<1)	
	{
		cerr<<"Error: heap underflow!"<<endl;
		return T(0);
	}
	T max = heapMax(heap);
	heap[0]=heap[heap.size()-1];
	heap.pop_back();
	maxHeapify(heap,0,heap.size());
	return max;
}

template<typename T>
void heapIncreaseKey(vector<T>& heap, int i, T key)//i为C下标从0开始
{
	if(i>=heap.size() || i<0) return;
	if(key<heap[i]) 
	{
		cerr<<"New key is smaller than current key"<<endl;
		return;
	}

	heap[i] = key;

	while (i>0 && heapParent(i)<heap[i])
	{
		swap(heap[i],heap[heapParent(i)]);
		i=heapParent(i);
	}

}

template<typename T>
void heapDelete(vector<T>& heap, int i)//i为C下标从0开始
{
	if(i>=heap.size() || i<0) return;
	heap[i] = heap[heap.size()-1];
	heap.pop_back();
	maxHeapify(heap,i,heap.size());
}

template<typename T>
void heapPrint(const vector<T>& heap)
{
	for(auto x:heap)
	{
		cout<<x<<" ";
	}
	cout<<endl;
}


void test()
{
	//初始化数组
	int a[8] = {2,4,7,1,4,8,9,31};
	vector<int> heap(a, a+8);

	//序列输出
	heapPrint(heap);

	//testing operation
	buildMaxHeap(heap, heap.size());

	//建立大顶堆后输出
	heapPrint(heap);

	//最大值测试
	cout<<"Max = "<<heapMax(heap)<<endl;

	//抽去最大值后
	heapExtractMax(heap);
	cout<<"After extract max:\n";
	heapPrint(heap);

	//增加其中一个值为100
	heapIncreaseKey(heap, 3, 100);
	cout<<"After increase a key to 100:\n";
	heapPrint(heap);

	//删除刚增加的值100一个值
	heapDelete(heap, 3);
	cout<<"After delete one key:\n";
	heapPrint(heap);
}

int main()
{
	test();
	return 0;
}


总结:

熟悉堆操作的话,这个算法实现没有难度。

reference:

Introduction to Algorithm

分享到:
评论

相关推荐

    Introduction_to_Algorithms_3rd_Edition

    文档提及了堆(Heaps)和优先级队列(Priority Queues),这是实现堆排序的基础。堆是一种特殊的完全二叉树,可以高效地支持多种操作,如插入元素、删除最大(或最小)元素等。 10. 版权和出版信息: 书籍的最后...

    leveled queue

    在Level Queue中,任务按照其优先级进行排序,高优先级的任务先被处理。 ### 1. 基本概念 - **优先级队列(Priority Queue)**:一种特殊的队列,取出元素时遵循“优先级”原则,通常最高优先级的元素最先出队。 -...

    算法ppt.zip

    4. **优先队列(Priority Queues)**:051_24PriorityQueues.pdf 介绍的是优先队列的概念,它允许插入元素并快速删除具有最高优先级的元素,常用于实现堆排序或处理紧急事件。二叉堆是一种常见的优先队列实现方式。 5...

    数据结构、算法及其应用.pptx

    本文件主要探讨了堆(Heap)、左高树(Leftist Trees)以及它们在优先队列(Priority Queues)中的应用,特别是如何利用这些数据结构优化操作效率。 堆是一种特殊的树形数据结构,分为最大堆和最小堆。在最大堆中,...

    数据结构与算法分析指导书

    优先级队列(堆)(Priority Queues (Heaps)) - **主要内容**:优先级队列是一种特殊的队列,其中每个元素都有一个优先级,队列中的操作优先考虑具有较高优先级的元素。本章将介绍如何使用堆来实现高效的优先级...

    算法导论(第三版) 英文原版

    优先队列(Priority queues)是堆的一个重要应用,它支持插入操作和删除具有最高优先级元素的操作。 书中还介绍了一种非常著名的排序算法——快速排序(Quicksort)。快速排序采用了分治策略来对一个序列进行排序,...

    数据结构与算法分析c++描述习题答案

    #### 优先级队列(Priority Queues) 优先级队列是一种特殊类型的队列,其中每个元素都有一个优先级,处理时总是先处理优先级最高的元素。堆(Heap)是一种实现优先级队列的有效数据结构,通常采用完全二叉树的形式...

    算法导论 练习题答案

    - **堆排序算法**(The Heapsort Algorithm) - 堆排序算法的具体实现步骤。 - **优先队列**(Priority Queues) - 基于堆实现的高效优先级队列数据结构。 #### 7. 快速排序 - **标题**:“Quicksort” - **...

    C语言-VB-编程英语单词.doc

    3. **堆 (Priority Queues)**:堆是一种特殊类型的树形数据结构,通常用于实现优先级队列,常用于调度和优化问题。 4. **图数据结构 (Graph Data Structures)**:图用于表示对象之间的关系,包括邻接矩阵和邻接表等...

    数据结构与算法分析(c语言描述)第二版 习题解答 英文原版

    第6章“Priority Queues (Heaps)(优先队列/堆)”则介绍了优先队列这种数据结构,它允许元素按照优先级进行插入和删除。堆是一种特定类型的树,通常用于实现优先队列。 第7章“Sorting(排序)”涉及到如何有效地...

    主流数据结构教科书课后答案

    **优先队列(堆)(Priority Queues (Heaps))** - 第六章讲解优先队列和堆的概念。优先队列是一种特殊的队列,其中每个元素都有一个优先级。堆是一种特殊的完全二叉树,可以实现优先队列。 - **最小堆**:每个...

    数据结构与算法分析(英文版。第三版)答案

    优先级队列(堆) (Priority Queues (Heaps)) - **知识点**:讲解了基于堆的优先级队列的实现方法。 - **关键概念**: - 堆的定义及其性质。 - 最大堆与最小堆。 - 插入、删除最大/最小元素的操作。 ##### 7. ...

    计算机常用术语.doc

    3. **堆(Priority Queues)**:堆是一种特殊的树形数据结构,其中每个父节点的值都大于或等于其子节点的值(最大堆)或小于或等于其子节点的值(最小堆),常用于优先级队列。 4. **图数据结构(Graph Data ...

    数据结构与算法分析C++描述答案

    优先队列是一种特殊的队列,其中的元素按照优先级排序。这一数据结构在任务调度、事件驱动模拟等领域非常重要。本章将介绍优先队列的基本概念、实现方法(如堆)以及性能分析。 #### 排序(Sorting) 排序是计算机...

    算法分析数据结构c++描述

    6. **优先队列(堆)**(Priority Queues (Heaps)):介绍基于堆的优先级队列的实现和应用。 7. **排序**(Sorting):涵盖各种排序算法,如冒泡排序、快速排序、归并排序等。 8. **不相交集**(The Disjoint Set)...

Global site tag (gtag.js) - Google Analytics