堆排序(Heap Sort)的C语言实现

堆排序(Heap Sort)具体步骤为
  1. 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆
  2. 将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆
  3. 反复第2步。直至所有顶点被输出,序列变成从小到大的有序序列

 

C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp)

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define ERROR -1
 4 #define OK 1
 5 #define TRUE 1
 6 #define MAXSIZE 6
 7 typedef int Status;
 8 typedef int KeyType;
 9 typedef char InfoType;
10 
11 typedef struct{
12     KeyType score;
13     InfoType name[20];
14 }RedType;
15 
16 typedef struct{
17     RedType r[MAXSIZE+1];
18     int length;
19 }SqList;
20 
21 Status initSqList(SqList &l){
22     l.length=MAXSIZE;
23     for(int i=1;i<=l.length;i++){
24         printf("请输入第%d个同学的姓名:",i);
25         scanf("%s",l.r[i].name);
26         printf("请输入第%d个同学的分数:",i);
27         scanf("%d",&(l.r[i].score));
28     }
29     printf("初始化完毕"); 
30 }
31 /*
32     Name: 堆调整 
33     Copyright: http://www.cnblogs.com/gangtiexia
34     Author: 钢铁侠 
35     Date: 2015-12-12 21:05:20
36     Description: 参数1为要调整的无序序列,参数2为要调整的数据的位置,参数3为要调整的序列的长度 
37 */
38 
39 Status HeapAdjust(SqList &l,int m,int n){
40     RedType rc=l.r[m];//rc为要调整的数据
41     int j;
42     for(j=2*m;j<=n;j=j*2){ //接着调整互换下来的l.r[j],l.r[j]也要和他的孩子们满足堆的要求 
43         if(j<n&&l.r[j].score<l.r[j+1].score) j++;
44         if(l.r[j].score<rc.score) break; //此时要调整的数据l.rc满足堆的要求,故此数据不进行调整,调整下一个数据。 
45         l.r[m]=l.r[j];
46         m=j;
47     } //for循环完毕,m最终定位到rc需要放置的位置 
48     l.r[m]=rc;
49 } 
50 /*
51     Name: 创建大顶堆+堆排序 
52     Copyright: http://www.cnblogs.com/gangtiexia
53     Author: 钢铁侠
54     Date: 2015-12-12 21:05:14 
55     Description: 创建堆的过程实质就是堆调整的过程,堆排序实质就是反复将堆的顶部元素移到末尾的过程 
56 */
57 
58 Status HeapSort(SqList &l){
59     int i;
60     for(i=l.length/2;i>=1;i--){ //从最后一个非叶子节点开始调整每一个子树 
61         HeapAdjust(l,i,l.length); 
62     } 
63     for(i=l.length;i>1;i--)
64     {
65         RedType temp=l.r[1];
66         l.r[1]=l.r[i];
67         l.r[i]=temp;
68         HeapAdjust(l,1,i-1);
69     }
70 } 
71 
72 Status Traverse(SqList &l){
73     for(int i=1;i<=l.length;i++){
74         printf("\n第%d位同学为%s,分数为%d",i,l.r[i].name,l.r[i].score);
75     }
76 }
77 int main(){
78     SqList L;
79     initSqList(L);
80     HeapSort(L);
81     Traverse(L); 
82     return 0;
83 }

 

 

posted @ 2016-01-03 21:19  钢铁侠Mac  阅读(1105)  评论(0编辑  收藏  举报