原文链接:http://blog.youkuaiyun.com/morewindows/article/details/6709644
void MinHeapFixup1(int *a,int i){
int j;
int temp;
j = (i - 1) / 2;
temp = a[i];
while(j >= 0 && i != 0){
if(a[j] < a[i])
break;
a[i] = a[j];
i = j;
j = (i - 1) / 2;
}
a[i] = a[j];
}
void MinHeapFixup(int *a,int i){
for(int j = (i - 1) / 2; j >= 0 && i != 0 && a[j] > a[i];i = j,j = (i - 1) / 2)
swap(a[i],a[j]);
}
void MinHeapAddNum(int *a,int n,int num){
a[n] = num;
MinHeapFixup(a,n);
}
void MinHeapFixdown(int *a,int i,int n){
int j = 2 * i + 1;
int temp = a[i];
while(j < n){
if(j + 1 < n && a[j + 1] < a[j])
j++;
if(a[j] > temp)
break;
a[j] = temp;
i = j;
j = 2 * i + 1;
}
a[i] = temp;
}
void MinHeapFixdown2(int *a,int i,int n){
for(int j = 2 * i + 1; j < n && i < n;i = j,j = 2 * i + 1){
if(j + 1 < n && a[j + 1] < a[j])
j++;
if(a[j] > a[i])
break;
swap(a[j],a[i]);
}
}
void MinHeapDelNum(int *a,int n){
swap(a[0],a[n - 1]);
MinHeapFixdown(a,0,n - 1);
}
void MakeMinHeap(int *a,int n){
for(int i = n / 2 - 1;i >= 0;i--)
MinHeapFixdown(a,i,n);
}
void MinHeapSortToDes(int *a,int n){
MakeMinHeap(a,n);
for(i = n - 1;i >= 0;i--){
swap(a[0],a[i]);
MinHeapFixdown(a,0,i);
}
}