1、 存储数据的线性表应为顺序存储。三、数据结构设计使用顺序表实现,有关定义如下:typedef int Status;typedef int KeyType ; /设排序码为整型量typedef int InfoType;typedef struct /定义被排序记录结构类型KeyType key ; /排序码 I nfoType otherinfo; /其它数据项 RedType ; typedef struct RedType * r; /存储带排序记录的顺序表 /r0作哨兵或缓冲区 int length ; /顺序表的长度 SqList ; /定义顺序表类型四、功能设计(一)主控菜单设计为
2、实现通各种排序的功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。程序运行后,给出5个菜单项的容和输入提示,如下:1.起泡排序2.简单选择排序3.希尔排序4. 直接插入排序0. 退出系统(二)程序模块结构由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):主控菜单项选择函数menu()创建排序表函数 InitList_Sq()起泡排序函数Bubble_sort()简单选择排序函数SelectSort()希尔排序函数ShellSort();对顺序表L进行直接插入排序函数Insertsort()(三)函数调用关系程序的主要结构(函数调用关系)如下图所示
3、。其中main()是主函数,它负责调用各函数。进行调用菜单函数menu(),根据选择项04调用相应的函数。main()函数使for循环实现重复选择。其循环结构如下:for (;) long start,end; switch(menu() case 1: printf(* 起泡排序 *n); start=clock(); Bubble_sort(L); end=clock();%d msn,end-start); fp=fopen(D: 起泡排序 .txt,w if(fp=NULL)/打开文件失败 printf(打开文件失败!n exit(1); for(i=1;i=L.length;i+)
4、fprintf(fp,%d ,L.ri); fclose(fp); break; case 2:* 简单选择排序 *n SelectSort(L);直接插入排序.txt简单选择排序! case 3:* 希尔排序 *n ShellSort(L,an,14);希尔排序 .txt case 4:* 直接插入排序 *n Insertsort(L); case 0:t 退 出 ! return ; (四)文件结构1、sort.h:单链表相关的定义与声明2、sort.cpp:单链表运算的实现3、menu.h:主菜单函数的声明4、menu.cpp:主菜单函数的实现5、mn.cpp:主函数 (五)各函数的算法
5、设计1、InitList_Sq()算法原理:数组指针r指示线性表的基址,length指示线性表的当前长度,将随机生成的数赋给线性表,并生成相应文件。流程图: 开始申请存 随机生成30000个数字生成文件 Fp=NULL 将顺序表打印到文件 终止程序 关闭文件 结束 代码描述:Status InitList_Sq(SqList &L) /构造一个线性表 FILE *fp; L.r=(RedType *) malloc(LIST_INIT_SIZE*sizeof(RedType); if (! L.r) exit(OVERFLOW); /存储分配失败 L.length=30001; /表长度为30
6、001 srand(unsigned)time(NULL); for(int i=1; L.ri.key=rand()%30001+1; fp=fopen(构造一个线性表.txtif(fp=NULL)/打开文件失败 return OK;/InitList_Sq 算法的时间复杂度分析:O(n)2.Bubble_sort()每趟不断将记录两两比较,若发现逆序,则交换两个记录,使排序码较小的元素逐渐从后部移向前部(就象水底的气泡一样逐渐向上冒)。void Bubble_sort(SqList & RedType x; int n; n=L.length; /表长 for (int i=1; i=i;
7、 j-) if(LT(L.rj+1.key,L.rj.key) flag=1; /有交换,置标志 x=L.rj; /L.rj L.rj+1 L.rj=L.rj+1; L.rj+1=x; if(flag=0) break; /若无交换则可结束冒泡排序O(n2)3、SelectSort()第1趟:从R1Rn中选取最小值,与R1交换;第2趟:从R2Rn中选取最小值,与R2交换;第 i 趟:从RiRn中选取最小值,与Ri交换;第 n -1趟: 从Rn1Rn中选取最小值,与Rn1交换. 共通过n1趟,得到一个按排序码从小到大排列的有序序列void SelectSort(SqList & /对顺序表进行简
8、单选择排序L.length; +i) /在L.ri.L.length 中选择key最小的记录 int k=i; for(int j=i+1;j0)&(LT(L.r 0.key ,L.r j.key );j-=dk) L.r j+dk=L.r j; L.r j+dk=L.r 0;void ShellSort(SqList &L,int dlta,int t) /Shell排序,dlta为增量序列,t为增量个数 int k; for(k=0;kt;k+) ShellInsert(L,dltak);/ ShellSortO(n(2n)2)5、Insertsort()每步将一个待排序的对象,按其排序码
9、大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。在已形成的有序表中顺序查找,并在适当位置插入,把原来位置上的元素向后顺移。void Insertsort(SqList &L) /对顺序表L进行直接插入排序 for(int i=2; if (LT(L.ri.key,L.ri-1.key) /需将L.ri插入有序表 L.r0=L.ri; /复制为“哨兵”,暂存 for (int j=i-1;LT(L.r0.key,L.rj.key);j-) L.rj+1=L.rj; /位置j指示了第一个keyL.ri.key的元素 L.rj+1=L.r0; /将暂存在r0中的记录插入到正确位置 / printf( O(n2)五、测试数据和结果1、测试数据 随机产生30000个数2、测试结果本程序在VC+环境下实现,下面是对以上测试数据的运行结果。(1) 主菜单显示如下:六、结束语 本设计完成了课题要求的任务,较熟练地掌握了各种排序方法。在设计过程中,由于个别代码段设计不当多次出现程序溢出情况。在评判各种排序方法的用时上换了两种计时方法,现在使用的这个较为准确。从结果可以看出,堆排序和快速排序这两种方法最快。当然或许还有更快的排序方法,此处没有使用并列举出来。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1