最大堆和利用堆的性质对数组进行排序。
HeapFy函数是将节点i为根节点的子树变为最大堆(注意是维护后的i节点作为子树的根节点),length参数为堆得的元素个数
BuildHeap函数是将长度为length的数组建成一个最大堆。这里对每一个非叶子节点进行HeapFy
HeapSort对长度为length的数组进行排序(共有length个元素需要排序,下表从1开始)。步骤为先建一个最大堆,然后将堆顶元素与末尾元素互换,然后维护length-1个数的堆,直至堆的长度为1。这里有个关键的地方就是:如果节点的左右两颗子树分别为最大堆,则维护以i为根节点的堆必为最大堆。
代码如下:
#include<stdio.h> #include<stdlib.h> void printArray(int *array,int length){ int i; for(i=1;i<=length;i++){ printf("%d ",array[i]); } printf("\n"); } void HeapFy(int *array,int length,int i){ int left=i*2,right=i*2+1,large,temp; if(left<=length&&array[left]>array[i]){ large=left; }else{ large=i; } if(right<=length&&array[right]>array[large]){ large=right; } if(large!=i){ temp=array[i]; array[i]=array[large]; array[large]=temp; HeapFy(array,length,large);//recursion } } void BuildHeap(int *array,int length){ int i; for(i=length/2;i>0;i--){ HeapFy(array,length,i); } } void HeapSort(int *array,int length){ int i; int temp; BuildHeap(array,length); for(i=length;i>1;i--){ HeapFy(array,i,1); temp=array[i]; array[i]=array[1]; array[1]=temp; } } int main(void){ int a[]={0,4,111,56,12,57,-3,56,22,2,23};//1 to 10 printf("before:\n"); printArray(a,10); HeapSort(a,10); printf("after:\n"); printArray(a,10); return 0; }