堆排序(Heap Sort)具体步骤为
- 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆
- 将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆
- 反复第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 }
时间: 2024-10-11 22:51:46