>>>>
题目:编程分别实现快速排序算法、堆排序算法。一、需求分析
1.用户可以根据自己的需求输入一个顺序表。2.通过利用快速排序法按非递减排序已有的顺序表。3.通过利用堆排序按非递减排序已有的顺序表。4.程序执行的命令包括:
(1)创建顺序表(2)输出顺序表(3)快速排序算法排序(4)堆排序算法排序
二、概要设计
⒈为实现上述算法,需要顺序表的抽象数据类型:ADTsqlist{
数据对象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存在。
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