//首先建立大根堆,结点从0开始到n-1,建堆的时候从n/2-1到0,不断的筛选
//新的结点交换有可能破换原有的秩序。
//建立好大根堆之后呢,从n-1到0遍历结点,不断的将最后一个结点(依次递减)元素和
//首结点元素交换,保证最后一个结点(依次递减)始终最大,与此同时,首结点再交换之后
//秩序发生了变换,因此重新构建大根堆.....
#include<stdio.h>
void heap_adajust(int array[],int i,int length){
int j=2*i+1;
int temp=array[i];
while(j<=length-1){
if((array[j]<array[j+1])&&j<length-1){ //保证j对应的结点总是最大
j=j+1;
}
if(array[i]<array[j]){ //让当前结点与最大结点交换
array[i]=array[j];
array[j]=temp;
i=j;
j=2*i+1;
}
//i=j;
else{
break;
}
}
//array[i]=temp;
}
void heap_sort(int array[],int length){
int temp;
int i;
for(i=(length/2)-1;i>=0;--i)
heap_adajust(array,i,length); //不断的筛选,大者上浮,小者筛选下去,要判断交换后的结点是否破换原有的秩序
//for(i=length-1;i>=0;--i){
for(i=length-1;i>=0;--i){
temp=array[0];
array[0]=array[i];
array[i]=temp;
heap_adajust(array,0,i);
}
}
void main()
{
int i;
//int array[10]={0,1,2,3,4,5,6,7,8,9};
int array[10]={9,8,7,6,5,4,3,2,1,0};
heap_sort(array,10);
for(i=0;i<=9;++i){
printf("%d\n",array[i]);
}
}
参考:
http://book.51cto.com/art/201108/287061.htm
http://baike.baidu.com/view/157305.htm
http://blog.csdn.net/morewindows/article/details/6709644
书籍:数据结构(严蔚敏)