ps:以下图片内容来源于算法导论(黑皮书),max-heapify,build_max_heap等函数伪代码内容均和书上一致。
由于网上找不到和算法导论伪代码基本一致的c/c++代码复现,因此借课堂作业的机会大致复现了以下代码,变量属性基本与算法导论伪代码一致。
一、算法导论(大根堆以及优先队列[降序]):
二、c/c++代码复现小顶堆实现优先队列(升序):
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 1001;
const int MIN = -32767;
class MyArray{
public:
MyArray(int size,int len,int a[MAX]):heap_size(size),length(len) {
for(int i=0;i<=len;i++){
arr[i] = a[i];
}
};
int heap_size;
int length;
int arr[MAX];
};
void Min_Heapify(MyArray& A, int i){
int min = i;
int left = 2*i; //left_child
int right = 2*i+1; //right_child
if(left<=A.heap_size && A.arr[left] < A.arr[min]){
min = left;
}
if(right<=A.heap_size && A.arr[right] < A.arr[min]){
min = right;
}
if(min != i){
swap(A.arr[i],A.arr[min]);
Min_Heapify(A,min);
}
}
void Build_Min_Heap(MyArray& A){
A.heap_size = A.length;
for(int i=A.length/2; i>=1; i--){
Min_Heapify(A,i);
}
}
int Get_Min(MyArray& A){
return A.arr[1];
}
int Extract_Min(MyArray& A){
int min = A.arr[1];
A.arr[1] = A.arr[A.heap_size];
A.heap_size--;
Min_Heapify(A,1);
return min;
}
void Decrease_Key(MyArray& A, int i, int key){
A.arr[i] = key;
while(i > 1 && A.arr[i/2] > A.arr[i]){
swap(A.arr[i/2],A.arr[i]);
i = i/2;
}
}
void Insert(MyArray& A, int x){
A.heap_size++;
A.arr[A.heap_size] = MIN;
Decrease_Key(A,A.heap_size,x);
}
void heap_sort(MyArray& A){
Build_Min_Heap(A);
int temp = A.heap_size;
for(int i= A.length;i>=2;i--){
swap(A.arr[1],A.arr[i]);
A.heap_size--;
Min_Heapify(A,1);
}
A.heap_size = temp;
}
void show(MyArray& A){
for(int i=1; i<=A.heap_size; i++){
cout<<A.arr[i]<<" ";
}
cout<<endl;
}
int main(){
int arr[MAX] = {0,9,2,10,24,3,5,6,8,4,13};
//后续操作从a[1]开始,忽略arr[0]
MyArray A(10,10,arr);
Build_Min_Heap(A);
show(A);
cout<<"Get_Min(A): "<<Get_Min(A)<<endl;;
cout<<"Extract_Min(A): "<<Extract_Min(A)<<endl;;
show(A);
Insert(A,2);
show(A);
Decrease_Key(A,3,1);
show(A);
heap_sort(A);
show(A);
return 0;
}