利用优先队列实现堆排序(自顶向下自底向上堆化完全二叉树的运用)
2015-08-17 17:26
375 查看
源代码如下:
程序运行结果
#include <stdio.h> #include <stdlib.h> typedef struct Item *node; struct Item{ int data; char c; }; static Item *pq; static int N ; void swap(Item &a,Item &b){struct Item t = a;a = b;b = t;} void PQinit(int maxN){ pq = (node)malloc(maxN*sizeof(node)); N = 0; } int PQempty(){ return N==0; } void PQinsert(Item v){ pq[N++] = v; } Item PQdelmax(){ int j , max = 0; for(j=1;j<N;j++) if(pq[max].data<pq[j].data) max = j; swap(pq[max],pq[N-1]); return pq[--N]; } //自底向上堆化 完全二叉树 父节点的关键值大于等于子节点关键值 void fixUp(Item a[],int k){ //k表示破坏堆规则的位置 while(k>1 && a[k/2].data < a[k].data){ swap(a[k],a[k/2]); k = k/2; } } //自顶向下堆化 void fixDown(Item a[],int k,int n){ //k表示破坏堆规则关键字的位置 ,n为堆的大小 int j; while(2*k<=n ){ j = 2*k; if(j<n && a[j].data<a[j+1].data)j++; //处理好啦K处节点只有一个子节点的情况 if(a[k].data>=a[j].data)break; swap(a[k],a[j]); k = j; } } void headSort(Item a[],int l,int r){ int k , num = r-l+1; Item *b = a+l-1; for(k = num/2;k>=1;k--) fixDown(b,k,num);//初始化堆结构 while(num>1){ swap(b[1],b[num]); fixDown(b,1,--num); //每删除一个最大值关键字,修正堆结构 } } main(){ PQinit(40); struct Item a[8] = {{0,'0'},{7,'c'},{95,'c'},{12,'c'},{96,'c'},{76,'c'},{36,'c'},{46,'c'}}; int j,k ; for(j=1;j<=7;j++) printf("%d ",a[j].data); printf("\n\n排序后\n\n"); headSort(a,1,8); for(k=1;k<=7;k++) printf("%d ",a[k].data); }
程序运行结果
相关文章推荐
- POJ 3069.Saruman's Army(贪心)
- IOS 代码动态添加控件
- bootstrap-editable文档
- Amazon UI 学习笔记
- 搭建jboss服务
- XAMPP on Mac 组态 Virual Host
- 后台数据库读取Html值 到前台显示不了样式
- The model backing the 'ProductContext' context has changed since the database was created. EF6
- http
- MD5中使用16进制
- jmx使用应该注意的基本规范
- 笔记1
- KEIL工具,某变量在watch窗口不能实时修改值,其它变量都可以改
- HDOJ 4460 Friend Chains 图的最长路
- IOCP服务器开发常见问题
- 如何解决js跨域问题
- lldb与gdb命令比较
- scikit-learn介绍
- HD 2120 Ice_cream's world I 【并查集】
- Java____多态之上下转型与重写、重载概念复习