用C++实现模板优先级队列及堆排序实例

模板优先级队列,数组实现,再熟悉一下常用算法,同时简单的堆排序应用

写了一个是队列自增长,另一个为了演示我还添加了一个叫做FillPq的方法,这个方法可以使用一个数组直接填充到优先级队列里,此时,优先级队列并不优先,然后进行下滤调整,之后建堆完成,输出即可

#include “stdafx.h”

template< class T>
class PriorityQueue
{
private:
T *pq;
int N;
int capacity;
public:
PriorityQueue(void);
~PriorityQueue(void);
void Insert(T x);
T DelTop();
void Swim(int k);
void Sink(int k);
bool Less(int i,int j);
void Swap(int i,int j);
bool Resize();
void FillPq(T arr[],int size);
};

template< class T>
void PriorityQueue<T>::FillPq( T arr[],int size )
{
N=size;
capacity=2*size;
for (int i=0;i<size;i++)
{
pq[i+1]=arr[i];
}
}

template< class T>
PriorityQueue<T>::PriorityQueue(void)
{
pq=new T[10];
N=0;
capacity=10;
}

template< class T>
void PriorityQueue<T>::Insert( T x )
{
if (N==capacity)
{
Resize();
}
pq[++N]=x;
Swim(N);
}

template< class T>
T PriorityQueue<T>::DelTop()
{
T max=pq[1];
Swap(1,N—);
Sink(1);
pq[N+1]=NULL;
return max;
}
//下滤
template< class T>
void PriorityQueue<T>::Sink( int k )
{
while (2k<=N)
{
int j=2k;
if (j<N && Less(j,j+1))
{
j++;
}
if (!Less(k,j))
{
break;
}
Swap(k,j);
k=j;
}
}
//上浮
template< class T>
void PriorityQueue<T>::Swim( int k )
{
while (k>1 && Less(k/2,k))
{
Swap(k,k/2);
}
}

template< class T>
void PriorityQueue<T>::Swap( int i,int j )
{
T temp=pq[i];
pq[i]=pq[j];
pq[j]=temp;
}

template< class T>
bool PriorityQueue<T>::Less( int i,int j )
{
return pq[i]<pq[j];
}

template< class T>
bool PriorityQueue<T>::Resize()
{
T newPq=new T[capacity2];
capacity=capacity*2;
for (int i=1;i<=N;i++)
{
newPq[i]=pq[i];
}
pq=newPq;
return true;
}

template< class T>
PriorityQueue<T>::~PriorityQueue(void)
{
}

然后是堆排序

#include “stdafx.h”

include <iostream>
include <string>
include “PriorityQueue.cpp”

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
PriorityQueue<int> maxPq;

int arr[8]={1,2,4,3,6,8,7,5};
maxPq.FillPq(arr,8);
//建堆
for (int i=4;i&gt;0;i--)
{
maxPq.Sink(i);
}
//输出
for (int i=1;i&lt;=8;i++)
{
cout&lt;&lt;maxPq.DelTop();
}

}
 

时间: 2024-10-26 14:47:14

用C++实现模板优先级队列及堆排序实例的相关文章

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

在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象.这种数据结构就是优先级队列(Priority Queue) . 本文首先介绍优先级队列的定义,有序和无序数组以及堆数据结构实现优先级队列,最后介绍了基于优先级队列的堆排序(Heap Sort) 更

Java数组模拟优先级队列数据结构的实例_java

优先级队列如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权

[算法系列之四]优先级队列

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

C++:库函数优先级队列(priority_queue)输出最小值 代码

库函数优先级队列(priority_queue)的实现方式是堆(heap), 默认是输出最大值. 输出最小值, 需要指定参数, priority_queue<int, vector<int>, greater<int> > 代码: /* * main.cpp * * Created on: 2014.7.20 *更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/ * Author:

优先级队列实现哈夫曼树的编码和译码

//优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c),left(l)

stl的优先级队列

#include <iostream> #include <vector> #include <queue> using namespace std; class Timer; typedef Timer* RTimer; class Timer { public: Timer():_interval(0),_expires_time(0){} virtual ~Timer(){} virtual void schedule_timer(int sec,int usec

link中如何用大根堆小根堆实现优先级队列?是不是需要自己写数据结构?

问题描述 link中如何用大根堆小根堆实现优先级队列?是不是需要自己写数据结构? link中如何用大根堆小根堆实现优先级队列?是不是需要自己写数据结构? 解决方案 参考:http://download.csdn.net/download/Miu__Y/3309472

云计算设计模式(十六)——优先级队列模式

云计算设计模式(十六)--优先级队列模式 优先发送到服务,以便具有较高优先级的请求被接收和高于一个较低优先级的更快速地处理请求.这种模式是在应用程序是有用的,它提供不同的服务级别保证或者针对独立客户. 背景和问题 应用程序可以委托给其他服务的具体任务;例如,为了执行后台处理或与其他应用程序或服务的整合.在云中,消息队列通常用于将任务委派给后台处理.在许多情况下,请求由服务接收的顺序是不重要的.然而,在某些情况下,可能需要优先考虑的具体要求.这些要求必须早于较低优先级的其他可能先前已发送由应用程序

link环境下如何实现有序优先级队列?大根堆小根堆能用的么?

问题描述 link环境下如何实现有序优先级队列?大根堆小根堆能用的么? link环境下如何实现有序优先级队列?大根堆小根堆能用的么? 解决方案 自己用Queue构建一个就可以了.