zoukankan      html  css  js  c++  java
  • 堆排序(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("
    第%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 }
  • 相关阅读:
    Codeforces 377 A Maze【DFS】
    分糖果 5.0升级版
    poj_1201_Intervals
    NOIP2016全国信息学分区联赛提高组第二试 组合问题
    NOIP2016全国信息学分区联赛提高组第一试 玩具迷题
    NOIP 2016提高组总结
    2016年提高组模拟试题(20161105)Mahjong
    打鼹鼠
    2015年普级组模拟试题 小X的矩阵
    交汇的火力
  • 原文地址:https://www.cnblogs.com/gangtiexia/p/5097207.html
Copyright © 2011-2022 走看看