/* 首先说一下堆的性质: 1,它是一个完全二叉树 2,每个节点的值小于等于左右孩子节点的 值称为小根堆,反之为大根堆 3,对于节点i,左孩子为2i,右孩子为2i+1 (如果有的话) 堆排序的思想: 将待排序的序列构造成一个大根堆。此时,整个 序列的最大值就是堆顶的根节点。将它与堆数组的 末尾元素交换,此时末尾元素就是最大值,然后 将剩余的n-1个序列重新构造成一个堆,如此反复 就能得到一个有序序列。 */ #include<cstdio> #define MAX 1000 typedef struct SeqList { int Array[MAX]; int length; }SeqList; void Swap(SeqList *L,int i,int j) { int temp=L->Array[i]; L->Array[i]=L->Array[j]; L->Array[j]=temp; } void HeapAdjust(SeqList *L,int s,int len) { int temp,j; temp=L->Array[s]; for(j=2*s;j<=len;j=j*2) { if(j<len&&L->Array[j]<L->Array[j+1])//如果左孩子<右孩子,记录右孩子 j++; if(temp>=L->Array[j])//应该在S处插入 break; L->Array[s]=L->Array[j]; s=j; } L->Array[s]=temp; } void HeapSort(SeqList *L) { int i; for(i=L->length/2;i>0;i--) HeapAdjust(L,i,L->length);//把Array构造成一个大根堆 for(i=L->length;i>1;i--) { Swap(L,1,i);//与末尾元素交换 HeapAdjust(L,1,i-1);//将剩余元素构造成一个大根堆 } } int main(int argc,char *argv[]) { int i,n; SeqList L; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&L.Array[i]); L.length=n; HeapSort(&L); printf("After sort:\n"); for(i=1;i<=L.length;i++) printf("%4d",L.Array[i]); printf("\n"); return 0; }
原文:http://blog.csdn.net/u012736084/article/details/18896341