您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 数据结构课程设计排序算法演示系统
各专业全套优秀毕业设计图纸计算机学院数据结构课程设计题目:数据结构排序算法演示系统班级:姓名:学号:同组人姓名:起迄日期:课程设计地点:指导教师:评阅意见:成绩评定:评阅人:日期:完成日期:2014年12月目录一、课程设计的目的...................................1二、设计内容和要求...................................1三、数据采取的结构...................................1四、功能模块详细设计.................................14.1详细设计思想..................................24.1.1冒泡排序.................................54.1.2快速排序.................................74.1.3直接插入排序.............................94.1.4希尔排序................................104.1.5直接选择排序............................124.1.6堆排序..................................144.1.7归并排序................................17五、总结或心得体会..................................19六、参考文献........................................20七、附录............................................20-1-一.设计目的随着计算机技术的发展,各种排序算法不断的被提出。排序算法在计算机科学中有非常重要的意义,且应用很广泛。在以后的发展中排序对我们的学习和生活的影响会逐渐增大,很有必要学习排序知识。此次课程设计一方面使自己掌握排序的知识,另一方面锻炼一下团队合作开发系统的能力。二.设计内容和要求功能要求:(1)界面友好,易与操作。可采用菜单或其它人机对话方式进行选择。(2)实现各种内部排序。包括直接插入排序,冒泡排序,直接选择排序,希尔排序,快速排序,堆排序,归并排序。(3)待排序的元素的关键字为整数或(字符)。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。(1)演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标值的列表,以便比较各种排序的优劣。三.本设计所采用的数据结构typedefstruct{intkey;}RecType;四.功能模块详细设计希尔排序排序算法演示系统冒泡排序归并排序快速排序直接插入排序直接选择排序堆排序-2-4.1详细设计思想主函数:#includestdio.h#includestdlib.h#includemath.h#defineL8//排序元素个数#defineFALSE0#defineTRUE1typedefstruct{intkey;}RecType;RecTypeR[L];intnum;intsum;intsun;//定义排序趟数的全局变量//系统主界面//主函数intmain(){RecTypeS[100];inti,k;charch1,ch2,q;printf(\n\t\t***********排序算法演示系统************\n\n\t\t请输入%d个待排序的数据:\n,L);for(i=1;i=L;i++){printf(\t\t请输入第%dth数据:,i);scanf(%d,&S[i].key);getchar();}ch1='y';while(ch1=='y'){printf(\n\t\t菜单\n);printf(\n\t\t***********************************************\n);printf(\n\t\t*1--------更新排序数据*2--------直接插入排序\n);printf(\n\t\t*3--------希尔排序*4--------冒泡排序\n);printf(\n\t\t*5--------快速排序*6--------直接选择排序\n);printf(\n\t\t*7--------堆排序*8--------归并排序\n);printf(\n\t\t**********0--------退出************\n);printf(\n\t\t********************************************\n);-3-printf(\n\t\t请选择:);scanf(%c,&ch2);getchar();for(i=1;i=L;i++){R[i].key=S[i].key;}switch(ch2){case'1':printf(\n\t\t请输入%d个待排序数据\n\t\t,L);for(i=1;i=L;i++){scanf(%d,&S[i].key);getchar();printf(\t\t);}printf(\n\t\t数据输入完毕!);break;case'2':Insertsort();break;case'3':Shellsort();break;case'4':Bubblesort();break;case'5':printf(\n\t\t原始数据为(按回车键开始排序):\n\t\t);for(k=1;k=L;k++){printf(%5d,R[k].key);}getchar();printf(\n);num=0;sun=0;sum=0;Quicksort(1,L);printf(\n\t\t排序最终结果是:\n\t\t);for(k=1;k=L;k++){printf(%5d,R[k].key);}printf(\n\t\t比较次数是:%d\n\t\t,sum);-4-printf(\n\t\t交换次数是:%d\n\t\t,sun);break;case'6':Selectsort();break;case'7':Heap();break;case'8':Mergesort();break;case'0':ch1='n';break;default:system(cls);//清屏printf(\n\t\t对不起,您输入有误,请重新输入!\n);break;}if(ch2!='0'){if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8'){printf(\n\n\t\t排序完毕!);printf(\n\t\t按回车键继续!);q=getchar();if(q!='\n'){getchar();ch1='n';}}}}return1;}-5-图一主界面4.1.1冒泡排序核心思想依次比较相邻的两个数,将小数放在前面,大数放在后面,第一轮比较后,最大的数便被放到了最后;第二轮操作前n-1个数据(假设有n个数据),依然是依次比较相邻的两个数,将小数放在前面,大数放在后面,倒数第二个数便是第二大的数;同理第i轮操作前n-i+1的数据(假设i取值是从1开始的),则n-i+i位置上的数据为第i大的数据。一共有n-1轮,第i轮比较中共比较n-i次比较。核心代码voidBubblesort(){inti,j,k,x=0,y=0,m=0;intexchange=TRUE;//标志位exchange初始化为TRUE1printf(\n\t\t原始数据为(按回车键开始排序):\n\t\t);for(k=1;k=L;k++){-6-printf(%5d,R[k].key);}getchar();printf(\n);for(i=1;iL&&exchange==TRUE;i++)//外层对总的循环次数执行次数{exchange=FALSE;for(j=1;j=L+1-i;j++)//内层相邻记录的交换与比较{m++;//比较次数++if(R[j].keyR[j-1].key){R[0].key=R[j].key;R[j].key=R[j-1].key;R[j-1].key=R[0].key;exchange=TRUE;y++;//移动次数++}}m--;//比较次数if(exchange)//输出语句{printf(\t\t第%d趟冒泡排序的结果为:\n\t\t,i);for(k=1;k=L;k++){printf(%5d,R[k].key);}getchar();printf(\n);}}printf(\n\t\t比较次数是:\t\t);printf(%d,m);printf(\n\t\t移动次数是:\t\t);printf(%d,y);printf(\n\t\t排序最终结果是:\n\t\t);for(i=1;i=L;i++){printf(%5d,R[i].key);}}-7-图二直接插入排序4.1.2快速排序核心思想首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多核心代码//递归算法实现voidQuicksort(intlow,inthigh){inti=low,j=high,k;R[0].key=R[low].key;while(ij){while(ij&&R[0].key=R[j].key)//右侧扫描{j--;sum++;}-8-if(ij){R[i].key=R[j].key;//交换i++;sun++;}while(ij&&R[i].keyR[0].key)//左侧扫描{i++;sum++;}if(ij){R[j].key=R[i].key;//交换j--;sun++;}}R[i].key=R[0].key;num++;//输出语句包括排序的结果及次数printf(\t\t第%d趟快速排序的结果为:\n\t\t,num);for(k=1;k=L;k++){printf(%5d,R[k].key);}getchar();printf(\n);if(lowi-1)Quicksort(low,i-1);//递归部分(左侧)if(j+1high)Quicksort(j+1,high);//递归部分(右侧)}图三快速排序-9-4.1.3直接插入排序核心思想经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j]≤L[j+1]时为止核心代码voidInsertsort(){inti,j,k,m=0,x=0;//初始化比较次数变量m,移动次数变量xprintf(\n\t\t原始数据为:(按回车键开始排序)\n\t\t);for(k=1;k=L;k++){printf(%5d,R[k].key);}getchar();printf(\n);//主要运行部分for(i=2;i=L;i++){if(R[i].keyR[i-1].key){R[0]=R[i];j=i-1;while(R[0].keyR[j].key){R[j+1
本文标题:数据结构课程设计排序算法演示系统
链接地址:https://www.777doc.com/doc-6257752 .html