堆排序实现操作
优先队列
既然是队列那么先要包含头文件#include <queue>
, 他和queue
不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队
优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
堆的基本存储
二叉堆又分为最大堆个最小堆
最大堆:必须是一个完全二叉树,堆中的节点不大于其父节点的值。
[完全二叉树]
-
除了最后一层节点的个数以外,其它层节点的个数必须是最大值(满的)。
-
最后一层的节点数虽然可以不是最大数,但必须全部靠左。
最大堆的代码实现
template<typename Item>
class MaxHeap{
private:
Item* data;
int count;
int capacity;
void shiftUp( int k ){
while(k>1&&data[k/2]<data[k]){
swap(data[k/2],data[k]);
k/=2;
}
void shiftDown(int k){
while(2*k<=count){
int j = 2*k;//在此轮循环中,data【k】和data【j】交换位置
if(j+1<=count&&data[j+1]>data[j])
j+=1;
if(data[k]>=data[j])
break;
swap(data[k],data[j]);
k=j;
}
}
}
public:
MaxHeap(int capacity){
data = new Item[capacity +1];
count = 0;
this->capacity = capacity;
}
~maxHeap(){
delete [] data;
}
int size(){
return count;
}
bool isEmpty(){
return count == 0;
}
//插入操作
void insert(Item item){
assert(count + 1 <= capacity);
data[count+1] = item;
count++;
shiftUp(count);
}
//删除操作
Item extractMax(){
assert(count>0);
Item ret = data[1];
swap( data[1],data[count]);
count--;
shiftDown(1);
return ret;
}
};
int main(){
MaxHeap<int> maxheap = MaxHeap<int>(100);
cout<<maxheap.size()<<endl;
return 0;
}