堆排序
来源:互联网 发布:八股作文万花筒软件 编辑:程序博客网 时间: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
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 微信公众平台开发入门教程
- 第十讲,增加高清影像
- [UIDeviceRGBColor copyWithZone:]: unrecognized selector sent to instance
- 8种Nosql数据库系统对比
- LINUX系统编程之进程状态
- 堆排序
- uva 11054 Wine trading in Gergovia
- PHP中magic_quotes_gpc和 magic_quotes_runtime区别及其反斜线转义问题
- php5.5.9 curl 上传文件
- 15+ 个 tar 命令的用法,附示例
- IOS开发——TabelView下拉刷新
- Sql 操作 XML
- 多台笔记本同时上网方法
- b2DebugDraw到底是什么