第16周项目1-堆排序

来源:互联网 发布:装修 方面 vr 软件 编辑:程序博客网 时间:2024/06/05 11:35
/*     *烟台大学计控学院      *作    者:肖博文     *完成日期:2016年12月15日  *问题描述:用序列{57,40,38,11,13,34,48,75,6,19,9,7}作为测试数据,验证堆排序      */    


代码:

#include <stdio.h>    #define MaxSize 20    typedef int KeyType;    //定义关键字类型    typedef char InfoType[10];    typedef struct          //记录类型    {        KeyType key;        //关键字项        InfoType data;      //其他数据项,类型为InfoType    } RecType;              //排序的记录类型定义        //调整堆    void sift(RecType R[],int low,int high)    {        int i=low,j=2*i;                        //R[j]是R[i]的左孩子        RecType temp=R[i];        while (j<=high)        {            if (j<high && R[j].key<R[j+1].key)  //若右孩子较大,把j指向右孩子                j++;                                //变为2i+1            if (temp.key<R[j].key)            {                R[i]=R[j];                          //将R[j]调整到双亲结点位置上                i=j;                                //修改i和j值,以便继续向下筛选                j=2*i;            }            else break;                             //筛选结束        }        R[i]=temp;                                  //被筛选结点的值放入最终位置    }        //堆排序    void HeapSort(RecType R[],int n)    {        int i;        RecType temp;        for (i=n/2; i>=1; i--) //循环建立初始堆            sift(R,i,n);        for (i=n; i>=2; i--) //进行n-1次循环,完成推排序        {            temp=R[1];       //将第一个元素同当前区间内R[1]对换            R[1]=R[i];            R[i]=temp;            sift(R,1,i-1);   //筛选R[1]结点,得到i-1个结点的堆        }    }        int main()    {        int i,n=10;        RecType R[MaxSize];       KeyType a[]= {57,40,38,11,13,34,48,75,6,19,9,7};          for (i=1; i<=n; i++)            R[i].key=a[i];        printf("排序前:");        for (i=1; i<=n; i++)            printf("%d ",R[i].key);        printf("\n");        HeapSort(R,n);        printf("排序后:");        for (i=1; i<=n; i++)            printf("%d ",R[i].key);        printf("\n");        return 0;    }    

运行结果:


知识点总结:

堆排序算法的验证

0 0
原创粉丝点击