数据结构之选择排序之堆排序(参考严蔚敏数据结构)
2014-11-08 20:02
309 查看
//堆是一种存储结构,是满足完全二叉树的顺序存储结构
//理解大顶堆
//堆调整函数是对以当前结点为根结点的堆进行调整使其成为大顶堆,且默认只有根结点可能不满足大顶堆,根结点的所有子孙结点(如果有)皆满足大顶堆
//创建大顶堆函数是对所有的结点构成的堆经过从i=[n/2]直至i=1反复调用堆调整函数实现的
//堆排序函数是创建大顶堆之后,重复进行如下操作最终完成堆排序:将堆顶元素和最末尾的元素互换,更新后的末尾元素到位(最终排序成功后的位置)并不在堆调整范围内,
//调用堆调整函数(因为只有堆顶元素可能不满足最大堆性质)
#include<iostream>using namespace std;#define MAXSIZE 20 // 一个用作示例的小顺序表的最大长度#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)<(b))#define LQ(a,b) ((a)<=(b))typedef int InfoType; // 定义其它数据项的类型typedef int KeyType; // 定义关键字类型为整型typedef struct RedType // 记录类型{KeyType key; // 关键字项InfoType otherinfo; // 其它数据项,具体类型在主程中定义}RedType;typedef struct SqList // 顺序表类型{RedType r[MAXSIZE + 1]; // r[0]闲置或用作哨兵单元int length; // 顺序表长度}SqList;typedef SqList HeapType; // 堆采用顺序表存储表示void HeapAdjust(HeapType &H, int s, int m)//局部调整{ // 已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,本函数// 调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆(对其中记录的关键字而言)RedType rc;int j;rc = H.r[s];for (j = 2 * s; j <= m; j *= 2){ // 沿key较大的孩子结点向下筛选if (j<m&<(H.r[j].key, H.r[j + 1].key))//如果j下标对应key有右兄弟且key小于右兄弟key++j; // 更新j,j为key较大的记录的下标if (!LT(rc.key, H.r[j].key))break; // rc应插入在位置s上else{H.r[s] = H.r[j];s = j;}}H.r[s] = rc; // 插入}void CreateMTHeap(HeapType &H)//全局调整{// 把H.r[1..H.length]建成大顶堆int i;for (i = H.length / 2; i > 0; --i)HeapAdjust(H, i, H.length);//调用堆调整函数使i下标对应的结点为根结点的堆成大顶堆}void HeapSort(HeapType &H){ // 对顺序表H进行堆排序RedType t;int i;CreateMTHeap(H);for (i = H.length; i>1; --i){ /*将堆顶记录和当前未经排序子序列H.r[1..i]中最后一个记录相互交换,之后i下标对应元素到位(排序后应该在的位置)*/t = H.r[1];H.r[1] = H.r[i];H.r[i] = t;/*****************************************************************************************************8*/HeapAdjust(H, 1, i - 1); // 将H.r[1..i-1]重新调整为大顶堆}}void print(HeapType H){int i;for (i = 1; i <= H.length; i++)printf("(%d,%d)", H.r[i].key, H.r[i].otherinfo);printf("\n");}#define N 8void main(){RedType d= { { 49, 1 }, { 38, 2 }, { 65, 3 }, { 97, 4 }, { 76, 5 }, { 13, 6 }, { 27, 7 }, { 49, 8 } };HeapType h;int i;for (i = 0; i<N; i++)h.r[i + 1] = d[i];h.length = N;printf("排序前:\n");print(h);HeapSort(h);printf("排序后:\n");print(h);}
相关文章推荐
- 数据结构交换排序之起泡排序(参考严蔚敏数据结构)
- 堆排序 HeapSort C语言实现 附严蔚敏数据结构P282 代码错误
- 数据结构之交换排序之快速排序(参考整理严蔚敏数据结构)
- 关于拓扑排序(参考严蔚敏数据结构)
- 数据结构之实用单链表(参考整理严蔚敏数据结构)
- 数据结构之插入排序之希尔排序(缩小增量排序)—参考整理严蔚敏数据结构
- 数据结构之插入排序(直插,折半插,2路插)—参考整理严蔚敏数据结构
- 数据结构之链栈(参考整理严蔚敏数据结构)
- 数据结构之无向图(邻接表)—参考严蔚敏数据结构
- 数据结构之有向无环图邻接表利用栈实现拓扑排序(参考整理严蔚敏数据结构)
- 数据结构值行逻辑链接表实现矩阵运算(参考整理严蔚敏数据结构)
- 堆栈应用之进制转换(参考严蔚敏数据结构)
- 数据结构之无向图邻接表DFS之查询遍历关节点(参考整理严蔚敏数据结构)
- 数据结构之有向网邻接表实现拓扑与关键活动(参考整理严蔚敏数据结构)
- 数据结构之顺序表(部分参考C博客—文逗,整理和参考严蔚敏版数据结构)
- 数据结构之三元组顺序表实现稀疏矩阵运算(参考整理严蔚敏数据结构)
- 10-9-堆排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构之双向循环链表(参考整理严蔚敏数据结构)
- 赫夫曼编码程序(参考严蔚敏数据结构)
- C语言实现Huffman Tree(参考严蔚敏《数据结构》部分伪码)