堆排序算法(c语言)

/**
 * author:gubojun
 * time:2012-12-23
 * name:堆排序
 */

 /*
  解析:本程序对数列  312,126,272,226,28,165,123,8,12  进行排序
  首先进入heapsort函数对所有元素建堆

  初始状态------------------------------------------------------------------------
        0        1       2       3       4       5       6       7       8       9
     NULL      312     126     272     226      28     165     123       8      12
  4)------------------------------------------------------------------------------
        0        1       2       3       4       5       6       7       8       9
      226      312     126     272       8      28     165     123     226      12
  3)------------------------------------------------------------------------------
        0        1       2       3       4       5       6       7       8       9
      272      312     126     123       8      28     165     272     226      12
  2)------------------------------------------------------------------------------
        0        1       2       3       4       5       6       7       8       9
      126      312       8     123     126      28     165     272     226      12
   4    0        1       2       3       4       5       6       7       8       9
      126      312       8     123      12      28     165     272     226     126
  1)------------------------------------------------------------------------------
        0        1       2       3       4       5       6       7       8       9
      312        8     312     123      12      28     165     272     226     126
   2    0        1       2       3       4       5       6       7       8       9
      312        8      12     123     312      28     165     272     226     126
   4    0        1       2       3       4       5       6       7       8       9
      312        8      12     123     126      28     165     272     226     312
--------------------------------完成
  */
#include<stdio.h>
typedef struct{
    int r[101];
    int length;
}table;
/**************************************************
 *  函数功能:筛选算法
 *  函数参数:结构类型table的指针变量tab
 *            整型变量k为调整位置
 *            整型变量m为堆的大小
 *  函数返回值:空
 *  文件名:sift.c 函数名:sift()
 **************************************************/
void sift(table *tab,int k,int m){
    int i,j,finished;
    i=k;j=2*i;
    tab->r[0]=tab->r[k];
    finished=0;
    while((j<=m)&&!finished){
        if(j<m && tab->r[j+1] < tab->r[j]) j++;//如果看成二叉树,右子树的元素值小于左子树的元素值
        if(tab->r[0] <= tab->r[j]) finished=1;//如果r[0]是最小的就完成
        else{
            tab->r[i]=tab->r[j];
            i=j;
            j=j*2;
        }
    }
    tab->r[i]=tab->r[0];
}
/**************************************************
 *  函数功能:堆排序算法
 *  函数参数:结构类型table的指针变量tab
 *  函数返回值:空
 *  文件名:heapsort.c,函数名:heapsort()
 **************************************************/
void heapsort(table *tab){
    int i;
    for(i=tab->length/2;i>=1;i--)
        sift(tab,i,tab->length);/*对所有元素建堆,最小的数字在tab.r[1]中*/
    for(i=tab->length;i>=2;i--){/* i表示当前堆的大小,即等待排序的元素的个数*/
        tab->r[0]=tab->r[i];
        tab->r[i]=tab->r[1];
        tab->r[1]=tab->r[0];/*上述3条语句为将堆中最小元素和最后一个元素交换*/
        sift(tab,1,i-1);/*对剩下的元素建堆,最小的数字在tab.r[1]中*/
    }
}
int main(){
    table tab;
    int num[10]={272,126,312,226,28,165,123,8,12};
    int i;
    //初始化
    for(i=1;i<=9;i++){
        tab.r[i]=num[i-1];
    }
    tab.length=9;
    //打印初始表
    for(i=1;i<=9;i++){
        printf("%d  ",tab.r[i]);
    }
    printf("\n");
    //进行堆排序
    heapsort(&tab);
    //打印排序后的表
    for(i=1;i<=9;i++){
        printf("%d  ",tab.r[i]);
    }
    printf("\n");
}

    原文作者:排序算法
    原文地址: https://blog.csdn.net/gubojun123/article/details/8393853
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞