码迷,mamicode.com
首页 > 其他好文 > 详细

HeapSort

时间:2015-05-13 21:17:28      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

最小堆排序

先用一个筛的方法形成一个最小堆

那什么是最小堆呢?

也就是每一个父节点都比它的左右儿子大  

如何筛?

从最后一个非叶节点开始(也就是最后一个有儿子的节点),先比较它的左右儿子大小,和最大的交换。

最小堆形成后 根节点是最大的

把根节点和最后一个节点交换  那么最后一个节点就是排完序的最大值  存到数组中

然后继续用筛的方法  从第一个节点到去掉最后一个节点为止进行构造最小堆

详细看代码

 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 }

 

HeapSort

标签:

原文地址:http://www.cnblogs.com/threezj/p/4501346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!