已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
各专业全套优秀毕业设计图纸计算机学院数据结构课程设计题 目:数据结构排序算法演示系统 班 级: 姓 名: 学 号: 同组人姓名: 起 迄 日 期: 课程设计地点: 指导教师: 评阅意见:成绩评定:评阅人: 日期:完成日期:2014年12月目录一、课程设计的目的1二、设计内容和要求1三、数据采取的结构1四、功能模块详细设计14.1 详细设计思想24.1.1 冒泡排序54.1.2 快速排序74.1.3 直接插入排序94.1.4 希尔排序104.1.5 直接选择排序12 4.1.6 堆排序14 4.1.7归并排序17五、总结或心得体会19六、参考文献20七、附录20一. 设计目的随着计算机技术的发展,各种排序算法不断的被提出。排序算法在计算机科学中有非常重要的意义,且应用很广泛。在以后的发展中排序对我们的学习和生活的影响会逐渐增大,很有必要学习排序知识。此次课程设计一方面使自己掌握排序的知识,另一方面锻炼一下团队合作开发系统的能力。二. 设计内容和要求功能要求:(1)界面友好,易与操作。可采用菜单或其它人机对话方式进行选择。(2)实现各种内部排序。包括直接插入排序,冒泡排序,直接选择排序,希尔排序,快速排序,堆排序,归并排序。(3)待排序的元素的关键字为整数或(字符)。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。(1) 演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标值的列表,以便比较各种排序的优劣。三. 本设计所采用的数据结构typedef struct int key;rectype;希尔排序排序算法演示系统冒泡排序归并排序快速排序 直接插入排序直接选择排序堆排序4. 功能模块详细设计4.1 详细设计思想主函数:#include#include#include #define l 8 /排序元素个数#define false 0#define true 1typedef structint key;rectype;rectype rl;int num; int sum;int sun; /定义排序趟数的全局变量 /系统主界面/主函数int main()rectype s100; int i,k;char ch1,ch2,q;printf(ntt*排序算法演示系统*nntt请输入%d个待排序的数据:n,l);for(i=1;i=l;i+)printf(tt请输入第%dth数据:,i);scanf(%d,&si.key);getchar(); ch1=y;while(ch1=y) printf(ntt 菜 单 n);printf(ntt*n);printf(ntt * 1-更新排序数据* 2-直接插入排序 n);printf(ntt * 3-希 尔 排 序* 4-冒 泡 排 序 n);printf(ntt * 5-快 速 排 序* 6-直接选择排序 n);printf(ntt * 7-堆 排 序 * 8-归 并 排 序 n);printf(ntt *0-退 出* n); printf(ntt*n);printf(ntt请选择:);scanf(%c,&ch2);getchar();for(i=1;i=l;i+)ri.key=si.key;switch(ch2)case 1:printf(ntt请输入%d个待排序数据ntt,l);for(i=1;i=l;i+)scanf(%d,&si.key);getchar();printf(tt);printf(ntt数据输入完毕!);break;case 2:insertsort();break;case 3:shellsort();break;case 4:bubblesort();break;case 5:printf(ntt原始数据为(按回车键开始排序):ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);num=0;sun=0;sum=0;quicksort(1,l);printf(ntt排序最终结果是:ntt);for(k=1;k=l;k+)printf(%5d,rk.key);printf(ntt比较次数是:%dntt,sum);printf(ntt交换次数是:%dntt,sun);break;case 6:selectsort();break;case 7:heap();break;case 8:mergesort();break;case 0:ch1=n;break;default:system(cls);/清屏printf(ntt对不起,您输入有误,请重新输入!n);break;if(ch2!=0)if(ch2=2|ch2=3|ch2=4|ch2=5|ch2=6|ch2=7|ch2=8)printf(nntt排序完毕!);printf(ntt按回车键继续!);q=getchar();if(q!=n)getchar();ch1=n;return 1;图一 主界面4.1.1 冒泡排序核心思想 依次比较相邻的两个数,将小数放在前面,大数放在后面,第一轮比较后,最大的数便被放到了最后;第二轮操作前n-1个数据(假设有n个数据),依然是依次比较相邻的两个数,将小数放在前面,大数放在后面,倒数第二个数便是第二大的数;同理第i轮操作前n-i+1的数据(假设i取值是从1开始的),则n-i+i位置上的数据为第i大的数据。一共有n-1轮,第i轮比较中共比较n-i次比较。核心代码void bubblesort()int i,j,k,x=0,y=0,m=0;int exchange=true;/标志位exchange初始化为true 1printf(ntt原始数据为(按回车键开始排序):ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);for(i=1;il&exchange=true;i+)/外层对总的循环次数执行次数exchange=false;for(j=1;j=l+1-i;j+) /内层相邻记录的交换与比较 m+;/比较次数+if(rj.keyrj-1.key)r0.key=rj.key;rj.key=rj-1.key;rj-1.key=r0.key;exchange=true;y+;/移动次数+m-;/比较次数if(exchange) /输出语句printf(tt第%d趟冒泡排序的结果为:ntt,i);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);printf(ntt比较次数是:tt);printf(%d,m);printf(ntt移动次数是:tt);printf(%d,y);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+) printf(%5d,ri.key);图二 直接插入排序4.1.2 快速排序核心思想 首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。 通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多核心代码/递归算法实现void quicksort(int low,int high) int i=low,j=high,k;r0.key=rlow.key;while(ij)while(ij&r0.key=rj.key) /右侧扫描j-;sum+;if(ij) ri.key=rj.key;/交换 i+;sun+;while(ij&ri.keyr0.key)/左侧扫描 i+;sum+;if(ij)rj.key=ri.key;/交换j-;sun+;ri.key=r0.key;num+;/输出语句包括排序的结果及次数 printf(tt第%d趟快速排序的结果为:ntt,num);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);if(lowi-1) quicksort(low,i-1);/递归部分(左侧)if(j+1high) quicksort(j+1,high);/递归部分(右侧)图三 快速排序4.1.3 直接插入排序核心思想经过i-1遍处理后,l1.i-1己排好序。第i遍处理仅将li插入l1.i-1的适当位置,使得l1.i又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较li和li-1,如果li-1 li,则l1.i已排好序,第i遍处理就结束了;否则交换li与li-1的位置,继续比较li-1和li-2,直到找到某一个位置j(1ji-1),使得lj lj+1时为止核心代码void insertsort()int i,j,k,m=0,x=0; /初始化比较次数变量m,移动次数变量xprintf(ntt原始数据为:(按回车键开始排序)ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);/主要运行部分for(i=2;i=l;i+)if(ri.keyri-1.key)r0=ri;j=i-1;while(r0.keyrj.key)rj+1=rj;j-;rj+1=r0;x+;m+;/输出语句包括排序的结果及次数 printf(tt第%d趟直接插入排序的结果为:ntt,m);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);printf(n);printf(ntt比较次数是:tt);printf(%d,m);printf(ntt移动次数是:tt);printf(%d,x);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+) printf(%5d,ri.key);图四 直接插入排序4.1.4 希尔排序核心思想 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2d1重复上述的分组和排序,直至所取的增量dt=1(dtdt-ld2d1),即所有记录放在同一组中进行直接插入排序为止。核心代码void shellsort()int i,j,gap,x,k,y=0,m=0; /初始化比较次数变量m,移动次数变量yprintf(ntt原始数据为:(按回车键开始排序)ntt);for(k=1;k0)for(i=gap+1;i0)if(rj.keyrj+gap.key)x=rj.key;/交换语句rj.key=rj+gap.key;rj+gap.key=x;j=j-gap;y+;/移动次数+elsej=0;gap=gap/2;m+;/比较次数+/输出语句包括排序的结果及次数 printf(tt第%d趟希尔排序的结果为:ntt,m);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);printf(ntt比较次数是:tt);printf(%d,m);printf(ntt移动次数是:tt);printf(%d,y);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+)printf(%5d,ri.key);printf(n); 图五 希尔排序4.1.5 直接选择排序核心思想 第一次从r0rn-1中选取最小值,与r0交换,第二次从r1rn-1中选取最小值,与r2交换,., 第i次从ri-1rn-1中选取最小值,与ri-1交换,.,第n-1次从rn-2rn-1中选取最小值,与rn-2交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.核心代码void selectsort()int i,j,k,h,x=0,y=0;printf(ntt原始数据为(按回车键开始排序):ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);for(i=1;il;i+)h=i;for(j=i+1;j=l;j+)x+; /比较次数if(rj.keyrh.key)h=j; /确定最小值if(h!=i)r0.key=ri.key;ri.key=rh.key;rh.key=r0.key;y+; /移动次数printf(tt第%d趟选择排序的结果为:ntt,i);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);/输出语句包括排序的结果及次数 printf(ntt比较次数:%d,x);printf(ntt移动次数:%d,y);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+)printf(%5d,ri.key);printf(n);图六 选择排序4.1.6 堆排序核心思想 堆排序是一树形选择排序,在排序过程中,将r1.n看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。将原始记录序列建成一个堆,成为初始堆,并输出堆顶元素;调整剩余的记录序列,使之成为一个新堆,再输出堆顶元素;如此反复进行,当堆中只有一个元素时,整个序列的排序结束,输出的序列便是原始序列的非递减有序序列。在堆排序的过程中,主要负责两方面的工作:一是如何将原始记录序列构造成一个堆,即建立初始堆;二是输出堆顶元素后,如何将剩余记录整理成一个新堆。核心代码void createheap(int root,int index,int *x,int *y)int j,temp,finish;j=2*root; /j指向左孩子temp=rroot.key;finish=0;while(j=index&finish=0)if(jindex)if(rj.key=rj.key)finish=1;elserj/2.key=rj.key;(*y)+;j=j*2;*x = *x+2;rj/2.key=temp;(*y)+;/堆排序void heapsort()int i,j,temp,k,x=0,y=0;for(i=(l/2);i=1;i-) /建立初始堆createheap(i,l,&x,&y);x=0;y=0;for(i=l-1,k=1;i=1;i-,k+) /将堆中根节点和最后一个节点交换temp=ri+1.key;ri+1.key=r1.key;r1.key=temp;createheap(1,i,&x,&y);printf(tt第%d趟堆排序的结果为:ntt,k);for(j=1;j=l;j+)printf(%5d,rj.key);getchar();printf(n);printf(ntt比较次数是:%dtt,x);printf(ntt移动次数是:%dtt,y);void heap()int i;printf(ntt原始数据为(按回车键开始排序):ntt);for(i=1;i=l;i+)printf(%5d,ri.key);getchar();printf(n);heapsort();printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+)printf(%5d,ri.key);printf(n);void merge(int low,int mm,int high,int *x,int *y)/两个有序序列的合并int i=low,j=mm+1,p=0;rectype *r1; /i对第一个开始到结尾,j从第二个开始到结尾r1=new rectypehigh-low+1;if(!r1)printf(内存不足!);while(i=mm&j=high)/两序列从起始位置开始将小的元素放入到r1中r1p+=(ri.key=rj.key)?ri+:rj+;(*x)+;(*y)+;while(i=mm)/第二段结束,剩余放入r1中r1p+=ri+;(*y)+;while(j=high)/第二段剩余,剩余放入r1中r1p+=rj+;(*y)+;for(p=0,i=low;i=high;p+,i+)/剩余元素放入r1中,赋予rri=r1p;(*y)+;图七 堆排序4.1.7 归并排序核心思想将有n个记录的原始序列看作n个有序子序列,每个子序列的长度为1,然后从第一个子序列开始,把相邻的子序列两两合并,得到n/2个长度为2或1的子序列(当子序列个数为奇数时,最后一组合并得到的序列长度为1),把这一过程称为一次归并排序,对第一次归并排序后的n/2个子序列采用上述方法继续顺序成对归并,如此重复,当最后得到的长度为n的一个子序列时,该子序列便是原始序列归并排序后的有序序列。核心代码void mergepass(int length,int *x,int *y)/一次二路归并排序 int i;for(i=1;i+2*length-1=l;i=i+2*length) merge(i,i+length-1,i+2*length-1,x,y); /函数调用if(i+length-1l) merge(i,i+length-1,l,x,y); /函数调用/归并排序void mergesort() /二路归并排序 int length,k,m=0,i,x=0,y=0;printf(ntt原始数据为(按回车键开始排序):ntt);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);for(length=1;lengthl;length*=2) mergepass(length,&x,&y);m+; /输出语句包括排序的结果及次数printf(tt第%d趟归并排序的结果为:ntt,m);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+) printf(%5d,ri.key);printf(n);printf(tt比较次数:%dn,x);printf(tt移动次数:%dn,y);图八 归并排序5. 总结或心得回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次小组制作的程序,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时我又从中学到了许多东西。但由于我对这样的排序系统还只是一个开始,了解的不多,这其中或许还有很多的不足,在这里也恳请各位老师能够对我们的作品指明不足并加以改正。总之,在这一次的课程设计过程中,我们查阅了大量的资料,对数据结构有了一点初步的认识,对于网络工程这些辅助性的教材也巩固了不少,为我们这次的课设提供了很大的帮助,锻炼了我们的能力,让我更加熟练了这门程序设计语言:c/c+语言,系统地学习了数据结构方面的知识,并更进一步提高了我们在程序设计、调试方面的技巧。更重要的是,它还让我们认识到了自己的不足,在编程方面,我仅仅是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这样才能在程序设计方面有所收获。在最后也感谢我们的小组成员,我在他的帮忙下顺利的做好自己负责的部分.六参考文献严蔚敏,吴伟明,数据结构(c语言版),清华大学出版社,2007年:p263-p288。七附录#include#include#include #define l 8 /排序元素个数#define false 0#define true 1typedef structint key;rectype;rectype rl;int num; int sum;int sun; /定义排序趟数的全局变量 /系统主界面void bubblesort()int i,j,k,x=0,y=0,m=0;int exchange=true;/标志位exchange初始化为true 1printf(ntt原始数据为(按回车键开始排序):ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);for(i=1;il&exchange=true;i+)/外层对总的循环次数执行次数exchange=false;for(j=1;j=l+1-i;j+) /内层相邻记录的交换与比较 m+;/比较次数+if(rj.keyrj-1.key)r0.key=rj.key;rj.key=rj-1.key;rj-1.key=r0.key;exchange=true;y+;/移动次数+m-;/比较次数if(exchange) /输出语句printf(tt第%d趟冒泡排序的结果为:ntt,i);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);printf(ntt比较次数是:tt);printf(%d,m);printf(ntt移动次数是:tt);printf(%d,y);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+) printf(%5d,ri.key);/递归算法实现void quicksort(int low,int high) int i=low,j=high,k;r0.key=rlow.key;while(ij)while(ij&r0.key=rj.key) /右侧扫描j-;sum+;if(ij) ri.key=rj.key;/交换 i+;sun+;while(ij&ri.keyr0.key)/左侧扫描 i+;sum+;if(ij)rj.key=ri.key;/交换j-;sun+;ri.key=r0.key;num+;/输出语句包括排序的结果及次数 printf(tt第%d趟快速排序的结果为:ntt,num);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);if(lowi-1) quicksort(low,i-1);/递归部分(左侧)if(j+1high) quicksort(j+1,high);/递归部分(右侧)void insertsort()int i,j,k,m=0,x=0; /初始化比较次数变量m,移动次数变量xprintf(ntt原始数据为:(按回车键开始排序)ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);/主要运行部分for(i=2;i=l;i+)if(ri.keyri-1.key)r0=ri;j=i-1;while(r0.keyrj.key)rj+1=rj;j-;rj+1=r0;x+;m+;/输出语句包括排序的结果及次数 printf(tt第%d趟直接插入排序的结果为:ntt,m);for(k=1;k=l;k+) printf(%5d,rk.key);getchar();printf(n);printf(n);printf(ntt比较次数是:tt);printf(%d,m);printf(ntt移动次数是:tt);printf(%d,x);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+) printf(%5d,ri.key);void shellsort()int i,j,gap,x,k,y=0,m=0; /初始化比较次数变量m,移动次数变量yprintf(ntt原始数据为:(按回车键开始排序)ntt);for(k=1;k0)for(i=gap+1;i0)if(rj.keyrj+gap.key)x=rj.key;/交换语句rj.key=rj+gap.key;rj+gap.key=x;j=j-gap;y+;/移动次数+elsej=0;gap=gap/2;m+;/比较次数+/输出语句包括排序的结果及次数 printf(tt第%d趟希尔排序的结果为:ntt,m);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);printf(ntt比较次数是:tt);printf(%d,m);printf(ntt移动次数是:tt);printf(%d,y);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+)printf(%5d,ri.key);printf(n); void selectsort()int i,j,k,h,x=0,y=0;printf(ntt原始数据为(按回车键开始排序):ntt);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);for(i=1;il;i+)h=i;for(j=i+1;j=l;j+)x+; /比较次数if(rj.keyrh.key)h=j; /确定最小值if(h!=i)r0.key=ri.key;ri.key=rh.key;rh.key=r0.key;y+; /移动次数printf(tt第%d趟选择排序的结果为:ntt,i);for(k=1;k=l;k+)printf(%5d,rk.key);getchar();printf(n);/输出语句包括排序的结果及次数 printf(ntt比较次数:%d,x);printf(ntt移动次数:%d,y);printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+)printf(%5d,ri.key);printf(n); void createheap(int root,int index,int *x,int *y)int j,temp,finish;j=2*root; /j指向左孩子temp=rroot.key;finish=0;while(j=index&finish=0)if(jindex)if(rj.key=rj.key)finish=1;elserj/2.key=rj.key;(*y)+;j=j*2;*x = *x+2;rj/2.key=temp;(*y)+;/堆排序void heapsort()int i,j,temp,k,x=0,y=0;for(i=(l/2);i=1;i-) /建立初始堆createheap(i,l,&x,&y);x=0;y=0;for(i=l-1,k=1;i=1;i-,k+) /将堆中根节点和最后一个节点交换temp=ri+1.key;ri+1.key=r1.key;r1.key=temp;createheap(1,i,&x,&y);printf(tt第%d趟堆排序的结果为:ntt,k);for(j=1;j=l;j+)printf(%5d,rj.key);getchar();printf(n);printf(ntt比较次数是:%dtt,x);printf(ntt移动次数是:%dtt,y);void heap()int i;printf(ntt原始数据为(按回车键开始排序):ntt);for(i=1;i=l;i+)printf(%5d,ri.key);getchar();printf(n);heapsort();printf(ntt排序最终结果是:ntt);for(i=1;i=l;i+)printf(%5d,ri.key);printf(n);void merge(int low,int mm,int high,int *x,int *y)/两个有序序列的合并int i=low,j=mm+1,p=0;rectype *r1; /i对第一个开始到结尾,j从第二个开始到结尾r1=new rectypehigh-low+1;if(!r1)printf(内存不足!);while(i=mm&j=high)/两序列从起始位置开始将小的元素放入到r1中r1p+=(ri.key=rj.key)?ri+:rj+;(*x)+;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水产苗种病害防治措施
- 消防安全演练操作规程
- 港口维护脚手架租赁协议
- 展厅装修合同模板
- 赔偿协议书范本自愿赔偿
- 商务酒店无障碍设施建设指南
- 教育培训管理创新策略
- 建筑工程加固新施工合同范本
- 冷冻食品库房虫害防治策略
- 旅游公司客户隐私保密规则
- YY∕T 1838-2022 一次性使用末梢采血器
- 《企业财务分析》课程思政教学案例
- 教师(班主任)个人廉政风险点查找和防控措施表
- DB11T 2003-2022 蒸压加气混凝土墙板系统应用技术规程
- GB∕T 29626-2019 汽轮发电机状态在线监测系统应用导则
- 上消化道出血病历模板书写规范范文
- 第三章-农业资源调查评价与区划方法课件
- 基层医疗卫生机构结核感染预防与控制指南T∕CHATA 018-2022
- 国际集装箱多式联运:第6章 集装箱多式联运运价及费用计收
- Maya菜单中英文对照表(新)
- 食物中毒应急流程图
评论
0/150
提交评论