优先级队列及小顶堆排序

优先级队列及小顶堆排序实现

/** @file          HeapSort.h

*  @copyright     personal

*  @brief         优先级队列及堆排序

*  @version       V1.0.0

*  @author        fangyuan

*  @date          2015/12/31

*  @note          测试版本

*/

#include "iostream"

using namespace std;

template<class T>

class CPriQueue

{

private:

int m_iIndex;

int m_iMaxsize;

T* m_pArray;

void swap(int i ,int j)

{

T t;

t = m_pArray[i];

m_pArray[i] = m_pArray[j];

m_pArray[j] = t;

}

void siftup()

{

int p;

for(int i = m_iIndex; i > 1 && m_pArray[p=i/2] > m_pArray[i]; i = p)

{

swap(p,i);

}

}

void siftdown()

{

int c;

for(int i = 1; (c=2*i) <= m_iIndex; i = c)//循环条件,有左结点

{

if(c+1 <= m_iIndex && m_pArray[c+1] < m_pArray[c])//右结点存在,且值比左结点小

{

c++;

}

if(m_pArray[i] <= m_pArray[c]) //当前结点值不大于左结点值,跳出循环

{

break;

}

swap(c,i);

}

}

public:

CPriQueue(int m)

{

m_iMaxsize = m;

m_pArray = new T[m_iMaxsize+1];

m_iIndex = 0;

}

void insert(T t)

{

if(m_iIndex >= m_iMaxsize)

{

cout << "堆大小超过最大值" << endl;

return;

}

m_pArray[++m_iIndex] = t;

siftup();//保持堆性质

}

T extract()

{

T value;

if(m_iIndex < 1)

{

cout << "此堆为空" << endl;

}

else

{

value = m_pArray[1];

m_pArray[1] = m_pArray[m_iIndex--];

siftdown();

}

return value;

}

//在原空间上进行排序,只使用一个单位额外空间

void heapSort()

{

int n = m_iIndex;//为了重用siftdown()

while(m_iIndex > 1)

{

swap(1,m_iIndex--);

siftdown();

}

m_iIndex = n;

}

void print()

{

for(int i = 1; i <= m_iIndex; ++i)

{

cout << m_pArray[i] << "\t";

}

cout << endl;

}

};

//优先级队列及堆排序测试

void priqueueTest()

{

CPriQueue<int> cp(100);

int value;

cout << "请输入需要插入堆的整数" << endl;

while(cin>>value)

{

cp.insert(value);

}

cp.print();

cout << cp.extract() << endl;

cp.print();

cp.heapSort();

cp.print();

}

int main()

{

//优先级队列

priqueueTest();

system("pause");

return 0;

}

//不足之处,欢迎指正。

时间: 2024-12-08 04:52:56

优先级队列及小顶堆排序的相关文章

优先级队列(小顶堆)的dijkstra算法

php实现迪杰斯特拉算法,并由小顶堆优化 1 <?php 2 3 class DEdge 4 { 5 public $nextIndex, $length; 6 7 public function __construct($nextIndex, $length) 8 { 9 $this->nextIndex = $nextIndex; 10 $this->length = $length; 11 } 12 } 13 14 class DNode 15 { 16 public $index

什么是优先级队列(priority queue)?

有时候我们需要在某个元素集合中找到最小值和最大值 .优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值(DeleteMax)的数据结构. 这两个操作和队列中的进队(EnQueue)和出队(DeQueue)操作很相似.区别就在于,在优先级队列中,数据进入的顺序与他们接受处理的顺序可能不同.就像工作日程,一般是按重要程度排序而不是到来顺序. 在优先级队列中,如果最小的元素总是优先级最高(即最小元素先出列

优先级队列与堆排序

转自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象.这种数据结构就是优先级队列(Pri

浅谈算法和数据结构: 五 优先级队列与堆排序

转载自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是

【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序

一.用模版实现大小堆 如果不用模版的话,写大小堆,就需要分别实现两次,但是应用模版的话问题就简单多了,我们只需要实现两个仿函数,Greater和Less就行了,仿函数就是用类实现一个()的重载就实现了仿函数.这个看下代码就能理解了.再设计参数的时候,需要把模版设计成模版的模版参数,因为要实现大小堆嘛!当我们实现好一个大堆或者小队的逻辑后只需要用模版接收的Greater或Less类定义一个变量,就能实现通用功能了. template<typename T> struct Less {     b

STL源码笔记(14)—堆和优先级队列(一)

STL源码笔记(14)-堆和优先级队列 priority_queue是拥有权值观念的queue,跟queue类似,其只能在一端push,一端pop,不同的是,每次push元素之后再容器内部元素将按照一定次序排列,使得pop得到的元素始终是当前权值的极大值. 很显然,满足这个条件就需要某些机制了,缺省情况下使用max-heap大顶堆来实现,联想堆排序的实现,使用大顶完成序列从小到大的排序,过程大概是: 把堆的根元素(堆中极大值)交换到最后 堆的长度减1 这样每次取出堆中的极大值完成排序,刚好与优先

经典白话算法之优先级队列

<1>概念 优先级队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列.它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序.优先级队列是堆的一种常见应用.有最大优先级队列(最大堆)和最小优先级队列(最小堆).优先级队列是一种维护有一组元素构成的集合S的数据结构. <2>优先队列支持的基本运算 [cpp] view plaincopy //建立一个保存元素为int的优先级队列,其实是建了一个小顶堆 //但是请特别注意这样的建的堆默认是

第十章笔记&#183;优先级队列

需求与动机 什么是优先级队列 优先队列是计算机科学中的一类抽象数据类型.优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务:优先级相同的元素按照其在优先队列中的顺序得到服务.优先队列往往用堆来实现. --wikipedia 应用需求 在医院门诊,如果只有一个医生,多位病人.按照通常流程来说,采用先到先服务的顺序(FIFO).但是如果病人中有人患有心脏病,那么显然这个病人需要得到优先治疗. 在计算机系统中,绝大多数支持多任务,这种多任务调度也类似于医院门诊.CPU相当于医生,计算任

1.5 实现优先级队列

body, td { font-family: 微软雅黑; font-size: 10pt; } Edit 1.5 实现优先级队列 问题: 实现一个队列,能够按照给定的优先级排序,并且每次pop操作时都可以返回优先级最高的那个元素. 解决方案 1.import heapq2.class PriorityQueue:3. def __init__(self):4. self._queue=[]5. self._index=06. def push(self,item,priority):7. he