目录1、问题描述: (2)1.1题目内容: (2)1.2基本要求: (2)1.3测试数据: (2)2、需求分析: (2)2.1程序的基本功能: (2)2.2输入值、输出值以及输入输出形式: (2)2.3各个模块的功能要求: (2)3、概要设计: (3)3.1所需的ADT,每个程序中使用的存储结构设计说明 (3)3.2主程序流程以及模块调用关系 (3)3.3每个模块的算法设计说明(流程图) (4)3.3.1气泡排序: (4)3.3.2直插排序 (5)3.3.3选择排序 (6)3.3.4希尔排序 (7)3.3.5快速排序 (8)4、详细设计: (9)4.1函数调用关系图 (9)5、各个算法实现的源程序: (9)5.1、冒泡排序及其主要算法 (9)5.2、直接插入排序及其主要算法 (10)5.3、选择排序及其主要算法 (10)5.4、希尔排序及其主要算法 (11)6、调试分析: (12)7、使用说明: (13)8、测试结果: (14)9、主要参考文献 (14)1、问题描述:1.1题目内容:内部排序算法实现与性能分析1.2基本要求:(1)数据结构定义(2)利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、希尔等排序方法进行排序,并统计每一种排序上机所花费的时间,对各种排序算法做分析比较.1.3测试数据:由函数随机产生的数据,由于是随机产生的,所以在此不一一写出。
2、需求分析:2.1程序的基本功能:输入30000个随机整数,对这些数进行多种方法进行排序,并对这些排序做比较,在屏幕上输出每种排序方法所比较的次数,交换的次数,和时间复杂度。
2.2输入值、输出值以及输入输出形式:由于程序中所需的数据都是有函数随机生成的整形数,不需要用户自己输入,用户只需要对演示程序中的一些提示做一些必要的选择以便于程序的执行。
程序输出的是对六种排序做的一些比较,即输出六种排序各排序过程中所比较的数据的个数,交换的数据的次数,和排序完成所用的时间。
六种排序依次在计算机终端上显示,便于用户观察。
2.3各个模块的功能要求:一、随机函数:产生随机数二、选择排序函数:对随机数进行选择排序三、起泡排序函数:对随机数进行气泡排序四、直接插入函数:对随机数进行直接插入排序五、希尔排序函数:对随机数进行希尔排序六、快速排序函数:对随机数进行快速排序七、主函数3、概要设计:3.1所需的ADT,每个程序中使用的存储结构设计说明typedef struct{int key;}ElemType;//元素类型typedef struct{ElemType *elem;int length;}SqList;//顺序表类型3.2主程序流程以及模块调用关系主函数main()初始化变量x,i;; 初始化线性表SqListL;Showthe menu显示主界面五种排序运行后打印结果五种排序用时的比较,不打印排序后的结果3.3每个模块的算法设计说明(流程图)3.3.1气泡排序:开始初始变量 i=1,j=1i 小于L.lengthj 小于L.lengthL.elem[j].key 大于L.elem[j+1].key交换第j 个和第j+1个元素j++YYY结束N开始初始变量i=2,ji<=L.lengt hY如果第i位比第i-1位的值小L.elem[0].key=L.elem[i].keyYj=i-1NN如果第0位比第j位的值小记录后移j=j-1L.elem[j+1].key=L.elem[0].keyY结束开始初始变量i=1,j,kI<lengthJ=i+1Y如果i位置上的值<=k位置上的交换数值位置Yj=j+1i=i+1结束N N开始Y结束N初始化变量 i,d=L.length/2,j,w=0w 小于di=1,i 小于L.length j=i+dJ 小于L.length第i 个元素大于第j 个元素交换第i 个元素第j 个元素d 变为原来的一半YYY开始结束NY Y初始化变量pivotkey,low,highLow小于high第high个元素大于pivotkey 第low个元素小于pivotkey第low个元素与第high个元素交换第high个元素与第low个元素交换high-- Low++Y4、详细设计:4.1函数调用关系图5、各个算法实现的源程序:5.1、冒泡排序及其主要算法void qipao(SqList &L)//起泡 {start_t=clock(); int i=1,j;while(i<L.length) {for(j=1;j<L.length;j++) {if(L.elem[j].key>L.elem[j+1].key) {L.elem[0].key=L.elem[j].key; L.elem[j].key=L.elem[j+1].key; L.elem[j+1].key=L.elem[0].key; }开始界面各排序输出结果 起泡 排 序 直插 排 序 选择 排 序 希尔排 序 快速 排 序各种排序用时比较起泡 排 序 用时 直插 排 序 用时 选择 排 序 用时 希尔 排 序 用时 快速 排 序 用时}i++;}5.2、直接插入排序及其主要算法void InsertSort(SqList &L) //直接插入{start_t=clock();int i,j;for(i=2;i<=L.length;i++){if(L.elem[i].key<=L.elem[i-1].key)//“<”,需将L.r[i]插入有序子序列{L.elem[0].key=L.elem[i].key; //复制为哨兵j=i-1;while(L.elem[0].key<L.elem[j].key){L.elem[j+1].key=L.elem[j].key; //记录后移j--;}L.elem[j+1].key=L.elem[0].key; //插入到正确位置}}5.3、选择排序及其主要算法void SelectSort(SqList &L)//选择{int i,j,k,;for(i=1;i<L.length;i++)//选择第i小的记录,并交换到位{for(j=i+1;j<L.length;j++){if(L.elem[j].key<=L.elem[k].key){L.elem[0].key=L.elem[i].key;L.elem[i].key=L.elem[k].key;L.elem[k].key=L.elem[0].key;//与第i个记录交换}}5.4、希尔排序及其主要算法void xier(SqList &L)//希尔排序并打印结果{start_t=clock();int i,d=L.length/2,j,w=0,k,yd=0,bj=0; //间长为dwhile(w<d){for(i=1;i<=L.length;i++) //第i个与第i+d个相比较{j=i+d;if(j<=L.length){if(L.elem[i].key>L.elem[j].key){k=j;bj++;if(i!=k){L.elem[0].key=L.elem[i].key;L.elem[i].key=L.elem[k].key;L.elem[k].key=L.elem[0].key;}}}}d=d/2;//间隔变为原来的一半}5.5、快速排序及其主要算法int Partition(SqList &L,int low,int high)//快速排序{int pivotkey;L.elem[0]=L.elem[low];yd1++;pivotkey=L.elem[low].key; //用子表的第一个记录作曲轴记录while (low<high) //从子表的两端交替的向中间扫描{yd1++;while(low<high&&L.elem[high].key>=pivotkey)--high;L.elem[low]=L.elem[high]; //将比轴记录小的记录交换到低端while (low<high&&L.elem[low].key<=pivotkey)L.elem[high]=L.elem[low]; //将比轴记录大的记录交换到高端}L.elem[low]=L.elem[0];return low; //返回曲轴所在位置}void QSort(SqList &L,int low,int high){ //对顺序表L.r[low..high]做快速排序int pivotloc;int i=1;if(low<high) //长度大于一{pivotloc=Partition(L,low,high);//将L.r[low..high]一分为二QSort(L,low,pivotloc-1); //对低字表递归排序QSort(L,pivotloc+1,high); //对高字表递归排序}}void QuickSort(SqList &L){ //对顺序表L做快速排序int j;BeforeSort();QSort(L,1,L.length);for(j=1;j<=L.length;j++)printf("%d ",L.elem[j]);display(yd1,bj1);}6、调试分析:1.产生随机数2.排序3.汇总7、使用说明:本演示程序对以下5种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序。
由系统生成30000个随机整数进行比较。
程序还可以考虑几组数据的典型性,如:正序、逆序和不同程度的乱序。
注意采用分块调试的方法。
在该程序中可能回有很多让人不满意的地方,我会在以后的学习中逐加改进的。
8、测试结果:9.主要参考文献1.严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,1997 2.朱战立.数据结构.西安:西安电子科技大学出版社,20043.严蔚敏,吴伟民.数据结构题集(C语言版).北京:清华大学出版社,2000。