码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2014-11-22 10:33:53      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   使用   sp   for   文件   div   

#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;
}

 

堆排序

标签:style   blog   io   color   使用   sp   for   文件   div   

原文地址:http://www.cnblogs.com/leijiangtao/p/4114760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!