堆排序

heapsort.h文件

#include<stdio.h>
#include<stdlib.h>


#define TRUE 1
#define FALSE 0


typedef int keyType;
typedef int otherType;


typedef struct{
keyType key;
otherType other_data;
}Record;


heapsort.cpp文件

#include "heapsort.h"


//堆调整
void shift(Record record[],int k,int m){//以下标为k开始到m看成是完全二叉树
Record r;
int data;
int i,j;
int finish;//判断调整是否完成

r=record[k];//把record[k]先暂存于r中
data=r.key;

i=k;
j=2*i;
finish=FALSE;

while(j<=m && (!finish)){
if(j<m && record[j].key<record[j+1].key){
j=j+1;
}

if(r.key>=record[j].key){
finish=TRUE;
}else{
record[i]=record[j];

//可能调整之后后面的元素还比它大
i=j;
j=2*i;
}
}

record[i]=r;
}




//创建堆
void CreateHeap(Record record[],int length){
int i,n;

n=length;

for(i=n/2;i>=1;i--){
shift(record,i,n);
}
}


//堆排序
void heapsort(Record record[],int length){
Record r;
int i,n;


n=length;


CreateHeap(record,length);


for(i=n;i>=2;i--){
r=record[1];
record[1]=record[i];
record[i]=r;

shift(record,1,i-1);
}
}




void main(){
int i,j;
Record record[20];
int len;


printf("请输入待排序记录的长度:");
scanf("%d",&len);


for(i=1;i<=len;i++)
{
printf("请输入第%d个记录元素:",i);
fflush(stdin);
scanf("%d",&j);
record[i].key = j;
}


for(i=1;i<=len;i++)
printf("%d  ",record[i].key);
printf("\n");

heapsort(record,len);


for(i=1;i<=len;i++)
printf("%d  ",record[i].key);


printf("\n");
}


运行结果如下:

请输入待排序记录的长度:6
请输入第1个记录元素:12
请输入第2个记录元素:24
请输入第3个记录元素:25
请输入第4个记录元素:9
请输入第5个记录元素:7
请输入第6个记录元素:13
12  24  25  9  7  13
7  9  12  13  24  25
Press any key to continue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值