堆排序

来源:互联网 发布:八股作文万花筒软件 编辑:程序博客网 时间:2024/06/08 15:26

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