堆排序

来源:互联网 发布:新媒体营销的数据 编辑:程序博客网 时间:2024/06/05 03:46
#include<stdio.h>#define N 9void AdjustHeap(int a[],int hn, int i){int left=2*i+1,right=2*i+2;  //i的左右孩子int smallest=i,temp;while(left<hn || right<hn){if(left<hn && a[left]<a[smallest])smallest=left;if(right<hn && a[right]<a[smallest])smallest=right;if(i!=smallest){temp=a[i];a[i]=a[smallest];a[smallest]=temp;i=smallest;left=2*i+1;right=2*i+2;}else break;}  //选出i的所有子孙中最小的与i交换}void HeapSort(int a[],int n){int hn=n;int temp;//初始建堆int begin=hn/2-1; //只需遍历一半的树for(int i =begin;i>=0;i--)AdjustHeap(a,hn,i);//循环交换、调整while(hn>1){temp=a[hn-1];a[hn-1]=a[0];a[0]=temp;hn--;AdjustHeap(a,hn,0);}} //堆顶与末尾的数字对换,此时堆顶是最小值,即把最小值放在了后面,实现从大到小排列int main(){int a[N]={34,123,4,6,22,13,3,-1,8};HeapSort(a,N);for(int i=0;i<N;i++)printf("%d ",a[i]);}

原创粉丝点击