快速排序和堆排序
更新时间:2023-09-05 21:00:01 阅读量: 教育文库 文档下载
题目:编程分别实现快速排序算法、堆排序算法
题目:编程分别实现快速排序算法、堆排序算法。
一、 需求分析
1. 用户可以根据自己的需求输入一个顺序表。
2. 通过利用快速排序法按非递减排序已有的顺序表。
3. 通过利用堆排序按非递减排序已有的顺序表。
4. 程序执行的命令包括:
(1)创建顺序表 (2)输出顺序表 (3)快速排序算法排序 (4) 堆排序算法排序
二、概要设计
⒈ 为实现上述算法,需要顺序表的抽象数据类型:
ADT sqlist {
数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可
唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
基本操作P:
Creatsqlist(&l)
操作结果:构造一个具有n个数据元素的顺序表l。
ListLength(L)
初始条件:线性表L已经存在
操作结果:返回L中数据元素的个数。
destroylist(&l)
初始条件:顺序表l存在。
操作结果:销毁顺序表l。
displaylist(l)
初始条件:顺序表l存在。
操作结果:显示顺序表l。
quicksort (&l)
初始条件:顺序表l存在。
操作结果:通过快速排序得到一个有序的顺序表l。
heapsort (&l)
初始条件:顺序表l存在。
操作结果:通过堆排序得到一个有序的顺序表l。
heapadjust (&l,s,m)
初始条件:顺序表l存在。
操作结果:调整h->r[s]的关键字,使h->r[s]成为一个大顶堆
partion (&l,&low,high)
初始条件:顺序表l存在。
题目:编程分别实现快速排序算法、堆排序算法
操作结果:交换顺序表中子表r[low...high]的记录,使枢轴记录到
位,并返回其所在的位置。
}ADT sqlist
2. 本程序有三个模块:
⑴ 主程序模块
main(){
初始化;
{
接受命令;
显示结果;
}
}
⑵ 创建顺序表的模块:主要建立一个顺序表;
⑶快速排序模块:得到一个有序的顺序表;
(4)输出顺序表模块:显示已创建顺序表;
(5)堆排序模块:得到一个有序的顺序表。
三、详细设计
⒈元素类型,结点类型
typedef struct
{
int key;
}keytype;
typedef struct
{ keytype r[100];
int length;
}sqlist;
2.对抽象数据类型中的部分基本操作的伪码算法如下:
/*创建顺序表*/
void creat(sqlist *l)
{
int i,key;
printf("please intput it's length:");
scanf("%d",&l->length);
printf("\n\nplease intput %d data\n",l->length);
for(i=1;i<=l->length;i++)
{
scanf("%d",&key);
l->r[i].key=key;
}
}
/*交换顺序表中子表r[low...high]的记录,使枢轴记录到位,并返回其所在的位置*/ int partion(sqlist *l,int low,int high)
题目:编程分别实现快速排序算法、堆排序算法
{ int pivotkey;
l->r[0]=l->r[low];
pivotkey=l->r[low].key;
while(low<high)
{ while(low<high&&l->r[high].key>=pivotkey)
--high;
l->r[low]=l->r[high];
while(low<high&&l->r[low].key<=pivotkey)
++low;
l->r[high]=l->r[low];
}
l->r[low]=l->r[0];
return low;
}
/*快速排序*/
void Qsort(sqlist *l,int low,int high)
{ int pivotloc;
if(low<high)
{ pivotloc=partion(l,low,high);
Qsort(l,low,pivotloc-1);
Qsort(l,pivotloc+1,high);
}
}
/*快速排序*/
void quicksort(sqlist *l)
{
Qsort(l,1,l->length);
}
/*显示顺序表*/
void display(sqlist *l)
{ int i;
for(i=1;i<=l->length;i++)
printf("%-4.2d",i);
printf("\n");
for(i=1;i<=2*l->length;i++)
printf("--");
printf("\n");
for(i=1;i<=l->length;i++)
题目:编程分别实现快速排序算法、堆排序算法
printf("%-4.2d",l->r[i].key);
}
/*调整h->r[s]的关键字,使h->r[s]成为一个大顶堆*/
void heapadjust(sqlist *h,int s,int m)
{ keytype rc;
int j;
rc=h->r[s];
for(j=2*s;j<=m;j*=2)
{ if(j<m&&h->r[j].key<h->r[j+1].key)
++j;
if(rc.key>=h->r[j].key) break;
h->r[s]=h->r[j];
s=j;
}
h->r[s]=rc;
}
/*对顺序表h进行堆排序*/
void heapsort(sqlist *h)
{ keytype rc;int i;
for(i=h->length/2;i>0;--i)
heapadjust(h,i,h->length);
for(i=h->length;i>1;--i)
{ rc=h->r[1];
h->r[1]=h->r[i];
h->r[i]=rc;
heapadjust(h,1,i-1);
}
}
3.主函数和其他函数的伪码算法
/*主函数*/
void main()
{ sqlist t;int i;
creat(&t);
Qsort(&t,1,t.length);
printf("\n\n");
printf("quicksort means:\n");
display(&t);
heapsort(&t);
题目:编程分别实现快速排序算法、堆排序算法
printf("\n");
printf("\nheapsort means:\n");
display(&t);
getch();
}
4 函数调用关系
heapadjust partion
四、调试分析
⒈开始的时候在编写快速排序算法的时候没有设置用子表的第一个记录作枢轴记录导致没
有得到正确的结果。
⒉在l->r[low]=l->r[high];语句进行交换时,写成l->r[low].key=l->r[high].key,一直
没有找到错误的地方,在看了参考资料后才发现是这里错了。
3. 算法的时空分析
各操作的算法时间复杂度比较合理
creat, partion,display为O(n) Qsort ,heapadjust,heapsort为 O(nlogn)
注:n为哈希表的长度。
5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使
调试也较顺利,各模块有较好的可重用性。
五、用户手册
⒈ 本程序的运行环境为windows xp操作系统,并且在TC2.0中运行,执行文件为Exp10.c;
2. 进入演示程序后,完成编译,再点击超级工具集里的中文DOS环境运行选项,进入DOS
环境中,用户根据需求键入相应的数据,可以看到相应的结果。
六、测试结果
在dos下输入数据元素:
98 23 10 56 21 23 01 64 74 34
排序后的结果是:
01 10 21 23 23 34 56 64 74 98
则在dos界面输入如图所示:
题目:编程分别实现快速排序算法、堆排序算法
七、附录:源程序
#include<stdio.h>
typedef struct
{
int key;
}keytype;
typedef struct
{ keytype r[100];
int length;
}sqlist;
/*创建顺序表*/
void creat(sqlist *l)
{
int i,key;
printf("please intput it's length:");
scanf("%d",&l->length);
printf("\n\nplease intput %d data\n",l->length);
for(i=1;i<=l->length;i++)
{
scanf("%d",&key);
l->r[i].key=key;
}
}
/*交换顺序表中子表r[low...high]的记录,使枢轴记录到位,并返回其所在的位置*/ int partion(sqlist *l,int low,int high)
{ int pivotkey;
l->r[0]=l->r[low];
pivotkey=l->r[low].key;
while(low<high)
{ while(low<high&&l->r[high].key>=pivotkey)
题目:编程分别实现快速排序算法、堆排序算法
--high;
l->r[low]=l->r[high];
while(low<high&&l->r[low].key<=pivotkey) ++low;
l->r[high]=l->r[low];
}
l->r[low]=l->r[0];
return low;
}
/*快速排序*/
void Qsort(sqlist *l,int low,int high)
{ int pivotloc;
if(low<high)
{ pivotloc=partion(l,low,high);
Qsort(l,low,pivotloc-1);
Qsort(l,pivotloc+1,high);
}
}
/*显示顺序表*/
void display(sqlist *l)
{ int i;
for(i=1;i<=l->length;i++)
printf("%-4.2d",i);
printf("\n");
for(i=1;i<=2*l->length;i++)
printf("--");
printf("\n");
for(i=1;i<=l->length;i++)
printf("%-4.2d",l->r[i].key);
}
/*调整h->r[s]的关键字,使h->r[s]成为一个大顶堆*/ void heapadjust(sqlist *h,int s,int m)
{ keytype rc;
int j;
rc=h->r[s];
for(j=2*s;j<=m;j*=2)
{ if(j<m&&h->r[j].key<h->r[j+1].key) ++j;
if(rc.key>=h->r[j].key) break;
h->r[s]=h->r[j];
s=j;
}
h->r[s]=rc;
}
题目:编程分别实现快速排序算法、堆排序算法
/*对顺序表h进行堆排序*/
void heapsort(sqlist *h)
{ keytype rc;int i;
for(i=h->length/2;i>0;--i) heapadjust(h,i,h->length); for(i=h->length;i>1;--i) { rc=h->r[1];
h->r[1]=h->r[i];
h->r[i]=rc;
heapadjust(h,1,i-1); }
}
/*主函数*/
void main()
{ sqlist t;int i;
creat(&t);
Qsort(&t,1,t.length);
printf("\n\n");
printf("quicksort means:\n"); display(&t);
heapsort(&t);
printf("\n");
printf("\nheapsort means:\n"); display(&t);
getch();
}
正在阅读:
快速排序和堆排序09-05
考核题 - 图文12-09
工程量清单计价与定额预算计价的区别和联系06-10
《审计学》试卷A10-11
机械原理课程设计说明书(包装机推包机构运动简图与传动系统设计)05-27
小学语文四(下)教材结构简介05-11
先天性心脏病介入治疗指南05-24
解剖题题库(含答案)05-17
生态环境保护的调查与思考02-20
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 排序
- 快速
- 早餐店创业计划书
- 中国_57033000_其他化纤簇绒地毯及其他簇绒铺地制品(2003-2013)进出口数据报告
- 朝花夕拾 内容
- 八年级数学分式习题:《分式计算及分式方程练习题》无答案
- 通用测试用例模板
- 金蝶KIS标准版固定资产计提折旧将剩余期间固定资产都折旧完的处理方法
- 创业计划书—校园二手服务计划
- 【小语种大资源】沪江日语绿宝书之【N2词汇之日常生活篇】
- 第四章 南北朝民歌
- 九宫格数独题目(打印版)
- 中职护理专业学生对口升学与就业意愿调查
- 第十五章 物质代谢的联系与调节测试题
- 全屋定制家居安装指导手册
- 三年级英语下册 Unit 3 How Do You Come to School单元测试卷 陕旅版
- 幼儿园膳食委员会工作计划
- 最新精编2020年大学《中国近现代史纲要》期末测试版题库100题(含参考答案)
- 微型计算机原理及应用习题解答
- 核酸是遗传物质的证据1(1)
- 下面就是山姆沃尔顿经营企业的十条规则
- 冠军起跑线由我画 教学设计