数据结构论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析
概要说明
本组设计的各种排序算法,用菜单实现选择某种排序算法。用程序实现直接插入排序算法、折半插入排序算法、谢尔排序算法、选择排序算法、堆排序算法、2-路归并排序算法、冒泡排序算法。输入的数据形式为任何一个正整数(大小不限),输出数字大小逐个递增的数列。
程序的控制设计,不论是多简单的程序,都应该有良好的用户界面,只要程序一运行,就能从显示内容上看出这个是干什么的程序,能根据提示进行输入输出。可以设置多级菜单,用于各级功能模块的入口,并控制好如何返回,虽然实现的功能跟顺序执行的一样,但增加了不少灵活性,一个程序就应该尽最大努力来适应用户而不是让用户来适应程序。在具体函数的实现上也要好好斟酌算法,用以节省CPU和内存资源。
在系统软件和应用软件的开发设计过程中,都会不可能避免地遇到这样排序问题。在数据库和知识库管理系统中,排序应用更为广泛。在现今的高级计算机体系结构中,花费在排序上的时间占系统cpu时间的比重很大,据统计,在一些商用计算机系统中,花费在排序操作上的时间占cpu的时间可高达15%-75%。可见,排序是值得深入研究和认真剖析的有趣课题。
二概要设计
1·简要说明
本组设计的功能利用不同的算法尽量缩短时间复杂度,提高查找时间效率,能够将一个案值无序的数据元素序列转换成一个案值有序的数据元素序列。
本设计由7个被调用函数和一个主函数组成。先通过主函数mian()登录界面,显示菜单(不同的排序方法),申请一个动态空间(*c)即数组长度(排序的个数),然后输入数字排序的个数;再输入相应排序个数的数字即任何一个正整数(大小不限)。然后输入排序算法的序号,是通过switch函数选择排序的算法(调用算法函数),由用户自己选择。最后通过for循环语句将按数字大小逐个递增的数列输出。
程序的主要子函数声明如下:
冒泡排序算法:void BubbleSort(int*k,int Count);
折半排序算法:void bin_insertsort(int*k,int n);
谢尔排序算法:void shellsort(int*k,int n);
插入排序算法:void insertsort(int*k,int n);
选择排序算法:void selectsort(int*k,int n);
堆积排序算法:void adjust(int*k,int i,int n);
二路归并排序算法:void MergeSort(RecType R[],int low,int high)【通过void Merge(RecType *R,int low,int m,int high)】实现这种算法;通过这些不同的算法实现数字大小的排序。
本程序利用一维数组,先定义一个动态数组:
c=(int*)calloc(n,sizeof(int));
通过sancf语句将输入n值;n表示输入多少个排序的数字。利用for(i=1;i<=n;i++)和scanf("%d",&c[i])将排序的数字输入。然后通过菜单选者你想用的排序算法进行排序(数组),再通过for循环语句将排好序数字依次输出。
冒泡排序基本思想:
将n个记录看作按纵向排列,每趟排序时自下至上对每对相邻记录进行比较,若次序不符合要求(逆序)就交换。每趟排序结束时都能使排序范围内关键字最小的记录象一个气泡一样升到表上端的对应位置,整个排序过程共进行n-1趟,依次将关键字最小、次小、第三小…的各个记录“冒到”表的第一个、第二个、第三个…位置上。
希尔排序基本思想:
先取一个小于n的整数c[1]作为第一个增量,把文件的全部记录分成d1个组。所有距离为c[1]的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量c[2]<c[1]重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
插入排序基本思想:
先当前被插入元素k[i]保存在temp中,第i趟排序将序列中的第i+1个元素
ki+1(i=1,2……,n-1)插入到一个已经排好序的子序列(k1,k2,k3,……,ki)的合适位置,得到一个长度为i+1且仍然保持按值有序的子序列(k1,k2,k3,……,ki,ki+1)。插入排序方法的核心动作是插入,而寻找被插入元素的合适位置是主要的工作。
折半排序基本思想:
对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查找元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直到找到或找不到为止。
选择排序的基本思想:
每次从待排序序列中选择一个关键字最小的元素(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完为止。
堆积排序基本思想:
1·堆积树的存储
通常堆积树(Heap Tree)是通过一维整列来存储。
在一维阵列初始值为0时:
(1)堆积树的根节点存放在0的位置
(2)i节点左节点存放在2*i+1的位置
(3)i节点的右节点存放在2*i+2的位置
2·堆积树的操作
在堆积树的数据结构中,堆积树中的最大值总是位于根节点。堆积树中定义以下几种操作操作:
最大堆积调整(Max_Heapify):将堆积树的末端子结点作调整,使的子结点永远小于父结点
建立最大堆积(Build_Max_Heap):将堆积树所有数据重新排序
堆积排序(HeapSort):移除位在第一个数据的根结点,并做最大堆积调整的递归运算
二路归并排序
合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A 是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并排序算法的操作过程如图7所示:
初始值 [49] [38] [65] [97] [76] [13] [27]。看成由长度为1的7个子序列组成
第一次合并之后[38 49] [65 97] [13 76] [27]
,看成由长度为1或2的4个子序列组成。