第十六周实践项目1—验证算法(4)堆排序
2015-12-14 16:29
344 查看
/* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:项目1-4.cbp 作 者:刘晨筱 完成日期:2015年12月14日 版 本 号:v1.0 问题描述:用序列{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}作为测试数据, 运行算法对应程序,观察运行结果并深刻领会算法的思路和实现方法: 输入描述:无 程序输出:测试数据 */
代码详情:
*#include <stdio.h>
#define MaxSize 20
typedef int KeyType; //定义关键字类型
typedef char InfoType[10];
typedef struct //记录类型
{
KeyType key; //关键字项
InfoType data; //其他数据项,类型为InfoType
} RecType; //排序的记录类型定义
//调整堆
void sift(RecType R[],int low,int high)
{
int i=low,j=2*i; //R[j]是R[i]的左孩子
RecType temp=R[i];
while (j<=high)
{
if (j<high && R[j].key<R[j+1].key) //若右孩子较大,把j指向右孩子
j++; //变为2i+1
if (temp.key<R[j].key)
{
R[i]=R[j]; //将R[j]调整到双亲结点位置上
i=j; //修改i和j值,以便继续向下筛选
j=2*i;
}
else break; //筛选结束
}
R[i]=temp; //被筛选结点的值放入最终位置
}
//堆排序
void HeapSort(RecType R[],int n)
{
int i;
RecType temp;
for (i=n/2; i>=1; i--) //循环建立初始堆
sift(R,i,n);
for (i=n; i>=2; i--) //进行n-1次循环,完成推排序
{
temp=R[1]; //将第一个元素同当前区间内R[1]对换
R[1]=R[i];
R[i]=temp;
sift(R,1,i-1); //筛选R[1]结点,得到i-1个结点的堆
}
}
int main()
{
int i,n=11;//n=N-1(N为排序数个数)
RecType R[MaxSize];
KeyType a[]= {57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7};//a[0]空闲,不作为关键字
for (i=1; i<=n; i++)
R[i].key=a[i];
printf("排序前:");
for (i=1; i<=n; i++)
printf("%d ",R[i].key);
printf("\n");
HeapSort(R,n);
printf("排序后:");
for (i=1; i<=n; i++)
printf("%d ",R[i].key);
printf("\n");
return 0;
}运行结果:
知识点总结:
堆排序算法的验证。
相关文章推荐
- linq to sql 上传,显示图片
- java线程安全总结
- Xcode插件失效
- Unknown provider CookieStore
- 第十六周项目二~~大数据集上排序算法性能的体验
- TextView实现歌词同步
- Day1之ForDemo
- js script放在head跟body里面的区别
- Android 源码解析: 图片加载库Picasso 2 Cache机制
- 我的学习笔记(二)
- 以个性和情怀吸引用户
- android平台TextView使用ImageSpan画廊GIF图像
- MySQL存储过程及触发器
- iOS 十六进制的颜色值转换为UIColor
- pods的安装和使用
- 浅谈压缩感知(八):两篇科普文章
- 第十六周--项目2算法验证快速排序
- 第十六周上机实践项目1 - 验证算法(堆排序)
- 视频跟踪算法
- Java回调机制解析