最小堆排序
先用一个筛的方法形成一个最小堆
那什么是最小堆呢?
也就是每一个父节点都比它的左右儿子大
如何筛?
从最后一个非叶节点开始(也就是最后一个有儿子的节点),先比较它的左右儿子大小,和最大的交换。
最小堆形成后 根节点是最大的
把根节点和最后一个节点交换 那么最后一个节点就是排完序的最大值 存到数组中
然后继续用筛的方法 从第一个节点到去掉最后一个节点为止进行构造最小堆
详细看代码
1 #define N 11 2 #include "stdio.h" 3 void HeapAdjust(int a[],int s,int n) 4 { 5 int j,t; 6 while(2*s<=n) //有儿子则进行循环 7 { 8 j=2*s; 9 if(a[j]<a[j+1] && j+1<=n) //比较左右儿子大小 第二个判断排除了只有一个儿子的情况 10 j++; 11 if(a[s]<a[j]) //父节点和较大儿子交换 12 { 13 t=a[s]; 14 a[s]=a[j]; 15 a[j]=t; 16 s=j; //父节点等于较大儿子节点 继续向下筛选 17 } 18 else //节点最大了就不用筛选 注意 堆的筛选是建立在子树已经是一个堆的情况下 19 break; 20 } 21 } 22 void HeapSort(int a[],int n) 23 { 24 int i,t; 25 for(i=n/2;i>=1;i--) //从最后一个非页节点开始进行筛 26 HeapAdjust(a,i,n); 27 for(i=n;i>=1;i--) 28 { 29 t=a[1]; 30 a[1]=a[i]; 31 a[i]=t; //把根节点和最后一个节点进行交换 32 HeapAdjust(a,1,i-1); //从根节点开始到去除最后一个节点 继续进行筛 33 } 34 } 35 main() 36 { 37 int i,a[11]; 38 a[0]=-1; 39 for(i=1;i<=N;i++) 40 scanf("%d",&a[i]); 41 HeapSort(a,N); 42 for(i=1;i<=N;i++) 43 printf("%d ",a[i]); 44 }
时间: 2024-10-19 05:13:50