第十五周项目一(6)——堆排序

来源:互联网 发布:网页游戏编程软件 编辑:程序博客网 时间:2024/06/05 09:38
*Copyright(c)2017,烟台大学计算机与控制工程学院                                        *All rights reservrd.                                           *作者:王长青                                        *完成时间:2017年12月9日                                        *版本号:v1.0                                        *问题描述:用序列{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}作为测试数据,运行并本周视频中所讲过的算法对应 程序,观察运行结果并深刻领会算法的思路和实现方法:堆排序    *问题输入:无      *问题输出:见截图    


#include <stdio.h>  #include <iostream>#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[] = { 0,6,8,7,9,0,1,3,2,4,5 };//a[0]空闲,不作为关键字  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");system("pause");return 0;}


程序运行截图:



原创粉丝点击