快速排序和堆排序

发布时间:   来源:文档文库   
字号:


题目:编程分别实现快速排序算法、堆排序算法。一、需求分析
1.用户可以根据自己的需求输入一个顺序表。2.通过利用快速排序法按非递减排序已有的顺序表。3.通过利用堆排序按非递减排序已有的顺序表。4.程序执行的命令包括:
1)创建顺序表2)输出顺序表3)快速排序算法排序4堆排序算法排序
二、概要设计
为实现上述算法,需要顺序表的抽象数据类型:ADTsqlist{
数据对象DD是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可
唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。基本操作P:
Creatsqlist(&l
操作结果:构造一个具有n个数据元素的顺序表lListLength(L
初始条件:线性表L已经存在
操作结果:返回L中数据元素的个数。destroylist(&l
初始条件:顺序表l存在。操作结果:销毁顺序表ldisplaylistl
初始条件:顺序表l存在。操作结果:显示顺序表lquicksort(&l
初始条件:顺序表l存在。
操作结果:通过快速排序得到一个有序的顺序表lheapsort(&l
初始条件:顺序表l存在。
操作结果:通过堆排序得到一个有序的顺序表lheapadjust(&lsm
初始条件:顺序表l存在。
操作结果:调整h->r[s]的关键字,使h->r[s]成为一个大顶堆partion(&l&lowhigh
初始条件:顺序表l存在。

1


操作结果:交换顺序表中子表r[low...high]的记录,使枢轴记录到
位,并返回其所在的位置。
}ADTsqlist
2.本程序有三个模块:
主程序模块
main({初始化;{
接受命令;显示结果;
创建顺序表的模块:主要建立一个顺序表;⑶快速排序模块:得到一个有序的顺序表;(4输出顺序表模块:显示已创建顺序表;5)堆排序模块:得到一个有序的顺序表。
三、详细设计
⒈元素类型,结点类型typedefstruct{
intkey;}keytype;
typedefstruct{keytyper[100];intlength;
}sqlist;
2.对抽象数据类型中的部分基本操作的伪码算法如下:/*创建顺序表*/voidcreat(sqlist*l{
inti,key;
printf("pleaseintputit'slength:";scanf("%d",&l->length;
printf("\n\npleaseintput%ddata\n",l->length;for(i=1;i<=l->length;i++{
scanf("%d",&key;l->r[i].key=key;}}
/*交换顺序表中子表r[low...high]的记录,使枢轴记录到位,并返回其所在的位置*/intpartion(sqlist*l,intlow,inthigh

2


{intpivotkey;l->r[0]=l->r[low];pivotkey=l->r[low].key;while(low
{while(lowr[high].key>=pivotkey--high;
l->r[low]=l->r[high];
while(lowr[low].key<=pivotkey++low;
l->r[high]=l->r[low];}
l->r[low]=l->r[0];returnlow;}
/*快速排序*/
voidQsort(sqlist*l,intlow,inthigh{intpivotloc;if(low
{pivotloc=partion(l,low,high;Qsort(l,low,pivotloc-1;Qsort(l,pivotloc+1,high;}}
/*快速排序*/
voidquicksort(sqlist*l{
Qsort(l,1,l->length;}
/*显示顺序表*/
voiddisplay(sqlist*l{inti;
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++

3

本文来源:https://www.2haoxitong.net/k/doc/d1c11af5f61fb7360b4c6503.html

《快速排序和堆排序.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式