首页 > 代码库 > 堆排序
堆排序
#include<stdio.h>#define MAXSIZE 100 //假设文件长度,即待排序的记录数目typedef int KeyType;typedef struct{ KeyType key;}RcdType;typedef struct{ RcdType R[MAXSIZE+1];//存储待排序记录的一维数组,R或作为[0]闲置或作为“哨兵使用 int length;}SortSqlist;//关键字类型为KeyType自己定义void heapAdjust(SortSqlist &L,int s,int m){//已知L中记录R[s]~R[m]的关键字除R[s].key之外其余均满足大根堆的的定义//本函数调整R[s]~R[m]成为一个大根堆 int j; L.R[0]=L.R[s];//将R[s]放置R[0]中临时保存 for(j=2*s;j<=m;j*=2){//向下筛选,寻找R[0]的调整位置 if(j<m&&L.R[j].key<L.R[j+1].key)++j;//j指向为s的左右孩子中关键字较大者 if(L.R[0].key>=L.R[j].key)break;//筛选结束,R[0]应在位置s上插入 L.R[s]=L.R[j];s=j;//将R[j]调整到双亲节点位置上,继续向下寻找调整位置 }L.R[s]=L.R[0];//将R[0]调整到位置s处}void heapSort(SortSqlist &L){ //对顺序表L进行堆排序 int i; for(i=L.length/2;i>0;--i)//反复调用heapAdjust将R[1]~R[length]建成大顶堆 heapAdjust(L,i,L.length); for(i=L.length;i>1;--i){//反复调用heapAdjust实现排序 L.R[0]=L.R[1];L.R[1]=L.R[i];L.R[i]=L.R[0];//堆顶R[1]与最后一个R[i]交换 heapAdjust(L,1,i-1);//将R[1]~R[i-1]重新调整为大顶堆 }}int main(){ int i; SortSqlist L; printf("输入排序的个数"); scanf("%d",&L.length); for(i=1;i<=L.length;++i) scanf("%d",&L.R[i].key); heapSort(L); for(i=1;i<=L.length;i++) printf("%d ",L.R[i].key); return 0;}
堆排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。