堆排序2
/*堆排序(小顶堆) 2014.4.2*/ #include <iostream> using namespace std; //在堆(已是小顶堆)的末位插入数据i后,通过 //MinHeapFixup(节点上移)函数调整为小顶堆 void MinHeapFixup(int a[], int i) { int j, temp; temp=a[i]; j=(i-1)/2; //父结点 while(j>=0 &&i!=0) { if (a[j]<=temp) break; a[i] = a[j]; //把较大的子结点往下移动,替换它的子结点 i = j; j = (i - 1) / 2; } a[i] = temp; } //在最小堆中加入新的数据nNum void MinHeapAddNumber(int a[], int n, int i) { a[n] = i; //先插入数据i MinHeapFixup(a, n); //从新调整为小顶堆 } //将小顶堆树根数据和树末位数据交换后,通过MinHeapFixdown //(节点下移)函数将n个数据调整为小顶堆(i标示要调整的起点) void MinHeapFixdown(int a[], int i, int n) { int j, temp; temp=a[i]; j = 2 * i + 1; while (j<n) { if (j +1<n && a[j+1]<a[j]) //在左右孩子中找最小的 j++; if (a[j]>=temp) break; a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点 i=j; j = 2*i+1; } a[i] = temp; } //在最小堆中删除数 void MinHeapDeleteNumber(int a[], int n) { swap(a[0],a[n-1]); //将树根数据和树末位数据交换 MinHeapFixdown(a,0, n-1); //调整前n-1个数据为最小堆 } //建立最小堆 void MakeMinHeap(int a[], int n) { for (int i=n/2-1;i>=0;i--) MinHeapFixdown(a,i,n); } void MinheapsortTodescendarray(int a[], int n) { for (int i = n - 1; i >= 1; i--) { swap(a[i], a[0]); MinHeapFixdown(a, 0, i); } } int main(int argc, char *argv[]) { int a[]={0,16,20,3,11,17,8,15}; //要排序的数为a[1]...a[6],a[0]不参与排序 MakeMinHeap(a,8); MinheapsortTodescendarray(a,8); for(int i=7;i>=0;i--) //逆序输出 cout<<a[i]<<" "; cout<<endl; system("pause"); return 0; }
详细原理介绍见:http://blog.csdn.net/morewindows/article/details/6709644