void MinHeapFixup(int *a,int i){//向上调整 for(int j=(i-1)/2;(j>=0&&i)&&a[i]<a[j];i=j,j=(i-1)/2) swap(a[i],a[j]); } void MinHeapAddNumber(int *a,int n,int num){//push_heap a[n]=num; MinHeapFixup(a,n); } void MinHeapFixdown(int *a,int i,int n){//向下调整 for(int j=2*i+1;j<n;i=j,j=2*i+1){ if(j+1<n&&a[j+1]<a[j])j++; if(a[i]<=a[j])break; swap(a[i],a[j]); } } void MinHeapDeleteNumber(int *a,int n){//pop_heap swap(a[0],a[n]); MinHeapFixdown(a,0,n); } void MakeMinHeap(int *a,int n){//make_heap for(int i=n/2-1;i>=0;i--) MinHeapFixdown(a,i,n); } void MinHeapSort(int *a,int n){//heap_sort for(int i=n-1;i>=1;i--){ swap(a[i],a[0]); MinHeapFixdown(a,0,i); } }
原文:http://blog.csdn.net/starcuan/article/details/19016683