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