数据结构课程设计(33页).doc
《数据结构课程设计(33页).doc》由会员分享,可在线阅读,更多相关《数据结构课程设计(33页).doc(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-课 程 设 计 说 明 书课程名称: 数据结构和算法 设计题目: 多种排序 院 系: 计算机科学与信息工程学院 学生姓名: 学 号: 专业班级: 计科嵌入式(12-1) 指导教师: 年 月 日-第 32 页-课 程 设 计 任 务 书设计题目表达式计算程序设计学生姓名所在院系计科专业、年级、班12计科(嵌入式)设计要求:1) 采用如下七种方法实现上述问题求解:插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序。2) 统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。并将数据序列和不同的查找算法的性能结果记录入txt文件。学生应完成的工
2、作:1. 利用随机函数产生N个随机整数(10000以上)。2. 对这些数字进行排序。3. 采用插入、希尔、起泡、快速、选择、归并、堆排序方法解决问题。4. 对不同的排序算法进行性能比较并记录。参考文献阅读: 1. 数据结构(C语言版) 严蔚敏 清华大学出版社 2. C语言程序设计 丁峻岭 中国铁道出版社 3. C程序设计 谭浩强 清华大学出版社工作计划:任务下达日期: 年 月 日 任务完成日期: 年 月 日指导教师(签名): 学生(签名): 多种排序摘 要: 排序是算法中最基础的问题之一,经典的排序算法是前人不断总结得到的,基于比较的方法是比较直观的方式,主要存在插入法排序、堆排序、希尔排序、
3、归并排序、快速排序,每一种排序算法都有自己的优缺点,比如插入法排序适用于那些长度短的排序,要是长的话,有些爱莫能助啦,堆排序主要是依据了二叉堆的特性,但是创建堆的过程也是一个复杂的问题,希尔排序的过程是一个不断精确的过程,但是目前也只是一个经验方式。归并排序是一个递归的问题,采用分治的思想实现,但是这种算法需要额外的存储空间,快速排序虽然是实践中比较常用的算法,但是对于有序的数组采用快速排序就是灾难。比较型算法的时间复杂度最优也只能到达O(NlogN)。关键词:归并排序快排排序选择排序冒泡排序插入排序堆排序希尔排序内部排序目 录1. 设计背景41.1问题描述41.2 问题分析42.设计方案42
4、.1 算法设计4 2.2 功能模块分析63.主要算法流程图154. 结果与结论164.1正确结果164.2错误信息186. 收获与致谢197. 参考文献198. 附件201. 设计背景1.1问题描述 利用随机函数产生N个随机整数(10000以上),对这些数进行多种方法进行排序。包括:插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序。1.2 问题分析经典的排序算法是前人不断总结得到的,基于比较的方法是比较直观的方式,主要存在插入法排序、堆排序、希尔排序、归并排序、快速排序,每一种排序算法都有自己的优缺点。2. 设计方案2.1 算法设计(1) 选择排序 在待排序的一组数据元素中,
5、选出最小的一个数据元素与第一个位置的数据元素交换;然后在剩下的数据元素当中再找最小的与第二个位置的数据元素交换,循环到只剩下最后一个数据元素为止。 (2) 冒泡排序 相邻的两个元素进行比较,将小的调到前面,大的调到后面。 (3) 插入排序 待排序的记录放在数组R0n-1中排序过程中某一时刻,R被划分成两个子区间R0,i-1 (有序和)Rin-1(无序)。直接插入的基本操作是将当前无序区的一个记录Ri插入到有序区R0i-1中适当的位置 (4) 快速排序 在待排序的数组的n个元素中取一个元素(一般取第一个),将其移动到这样的位置:在其之前的元素的值都小于它,在其之后的元素都大于它,这样是一趟快速排
6、序;然后对数组的两个部分进行同样的操作,直到每部分只有一个记录为止;总之,每趟使表的第一个元素放在适当位置,将表两分,再对两子表进行同样的递归划分,直至划分的子表长度为1。(5)堆排序堆排序中 heap 算法的时间复杂度与堆所对应的完全二叉树的树高度 log2n 相关。而 heapsort 中对 heap 的调用数量级为n,所以堆排序的整个时间复杂度为O(nlog2n) 。并且堆排序是不稳定的。堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。(6)归并排序 将两个或两个以上的有序表组成一个新的有序表。 (7) 希尔
7、排序将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序.最后选择增量为1,即使用直接插入排序,使最终数组成为有序。增量的选择:在每趟的排序过程都有一个增量,至少满足一个规则 增量关系 d1 d2 d3 . dt = 1 (t趟排序);根据增量序列的选取其时间复杂度也会有变化,这个不少论文进行了研究,在此处就不再深究;本文采用首选增量为n/2,以此递推,每次增量为原先的1/2,直到增量为1。2.2 功能模块分析1. 数据输入:采取随机函数实现输入数据表。int input_num()
8、printf(您要给多少个数排序?ntt);scanf(%d,&data_num);srand(NULL);printf(随机产生%d个数:ntt,data_num);for(int i=1;i=1;i-)printf(%d%s,data_arrayi,i!=1? :n);其中增加了输出空格与换行区别。3. 主界面实现:printf(DATE:May twenty 2014n); printf(All Copyright Reserved 2014-2015 Wang Guangchun n); printf(ADDRESS: 604 AYITrnnn); printf( n); printf
9、(各种排序比较 n); printf(默认从大到小输出,可以选择9进行切换n); printf( n); printf( * * n); printf( * * * n); printf( * * n); printf( * 520 * n); printf( * 欢迎 * n); printf( * 使用 * n); printf( * * n); printf( * n); printf(欢迎再次使用!nrn); printf(*n); printf(* . . . . . *n); printf(* . . . . . . *n); printf(* . . . . . . *n); p
10、rintf(* . . . . . . *n); printf(* . . . . *n); printf(*n);4. 人机交互界面:printf(n n);printf(请输入指令 n);printf(* n);printf($ 1.快速排序 $ n);printf($ 2.归并排序 $ n);printf($ 3.堆排序 $ n);printf($ 4.希尔排序 $ n);printf($ 5.插入排序 $ n);printf($ 6.选择排序 $ n);printf($ 7.冒泡排序 $ n);printf($ 8.重新随机输入 $ n);printf($ 9.选择排序方式 $ n);
11、printf(* n);printf( 0.退出 n);printf( n);printf(请选择:n); printf(请输入指令 n); printf(* n); printf($ 1.从小到大 $ n); printf($ 0.从大到小 $ n); printf(* n); printf( 87.退出 n); printf( n); printf(请选择:n);5. 排序方法的实现:(1)选择排序void chose_sort(int a,int n)int min,temp;for(int i=0;in;i+)min=i;for(int j=i;jaj)min=j;temp=amin;
12、 amin=ai;ai=temp;(2) 希尔排序void ShellInsert(int *a,int d,int n)for (int i=d;i= 0&ajtemp)/从后向前,找到比其小的数的位置aj+d=aj;/向后挪动j-=d;if(j!=i-d)/存在比其小的数aj+d=temp;void ShellSort(int* a,int n)int d=n/2;/初始增量设为数组长度的一半while(d=1)ShellInsert(a,d,n);d=d/2;/每次增量变为上次的二分之一(3) 归并排序:void _merge(int a,int first,int mid,int la
13、st,int temp)int i=first,j=mid+1,m=mid,n=last,k=0;while(i=m&j=n)if(ai=aj)tempk+=ai+;elsetempk+=aj+;while(i=m)tempk+=ai+;while(j=n)tempk+=aj+;for(i=0;ik;i+)afirst+i=tempi;void MergeSort(int a,int first,int last,int temp) if(firstlast) int mid=(first+last)/2; MergeSort(a,first,mid,temp); MergeSort(a,mi
14、d+1,last,temp); _merge(a,first,mid,last,temp); bool MergeSort(int a,int n) int *p=new intn; if(p=NULL) return false; else MergeSort(a,0,n-1,p); delete p; return true; (4) 堆排序:void HeapAdjust(int *a,int i,int size)/调整堆 int lchild=2*i;/i的左孩子节点序号 int rchild=2*i+1;/i的右孩子节点序号 int max=i;/临时变量 if(i=size/2)
15、/如果i是叶节点就不用进行调整 if(lchildamax) max=lchild; if(rchildamax) max=rchild; if(max!=i) swap(ai,amax); HeapAdjust(a,max,size);/避免调整之后以max为父节点的子树不是堆 void BuildHeap(int *a,int size)/建立堆 int i; for(i=size/2;i=1;i-)/非叶节点最大序号值为size/2 HeapAdjust(a,i,size);void HeapSort(int *a,int size)/堆排序 int j=1; BuildHeap(a,s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 33
限制150内