数据结构课程设计排序算法演示系统方案

合集下载

数据结构课程设计-排序

数据结构课程设计-排序

一、问题描述1、排序问题描述排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。

简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。

本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。

我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。

其中包括:(1)插入排序的有关算法:不带监视哨的直接插入排序的实现;(2)交换排序有关算法:冒泡排序、快速排序的实现;(3)选择排序的有关算法:直接选择排序、堆排序的实现;(4)归并排序的有关算法:2-路归并排序的实现。

2、界面设计模块问题描述设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。

界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。

二、问题分析本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。

应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。

冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。

冒泡排序的步骤:1)置初值i=1;2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j]与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置;3)i=i+1;4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止;要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。

数据结构七个排序课程设计

数据结构七个排序课程设计

数据结构课程设计报告题目:排序的实现专业:软件工程班级:1502学号:姓名:时间:2016-12-26—2017-1-6一、问题描述1.题目内容:排序算法实现。

2.基本要求:用C语言或者C++设计一个排序综合系统。

3.测试数据:手写输入数据。

二、需求分析1.程序所能达到的基本功能。

1)设计一个菜单,格式如下:1.选择排序2.插入排序-3.起泡排序4.快速排序5.归并排序6.堆排序7.基数排序8.重新输入数据9.退出2)选择不同的菜单但进行相应的排序,并给出排序的关键字序列。

求出该排序算法运行时间,比较各排序间效率。

2.输入的形式和输入值的范围:所有整型的数。

3.输出的形式:从小到大输出排序结果和运行时间。

4.测试数据要求。

输入元素个数为正整数。

输入将要排序的数都为整型。

三、概要设计1.所需的ADT,它们的作用。

ADT SORT{数据对象:D=用户输入n数据元素;基本操作:void ShuRu(SqList &L); ------------------- 用户输入Void SelectSort(SqList &L);------------------- 选择排序void nsertSort(SqList &L); ------------------- 插入排序-void BBubbleSort(SqList &L); ------------------- 起泡排序void QuickSort(SqList &L); ------------------- 快速排序void MergeSort(SqList &L); ------------------- 归并排序void HeapSort(SqList &L); ------------------- 堆排序void RadixSort(SqList &L) ------------------- 基数排序}ADT SORT2.主程序流程及模块调用关系。

数据结构课程设计报告---几种排序算法的演示(附源代码)

数据结构课程设计报告---几种排序算法的演示(附源代码)

&数据结构课程设计报告—几种排序算法的演示(;时间:2010-1-14…一需求分析运行环境Microsoft Visual Studio 2005程序所实现的功能对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。

程序的输入(包含输入的数据格式和说明)%<1>排序种类三输入<2>排序数的个数的输入<3>所需排序的所有数的输入程序的输出(程序输出的形式)<1>主菜单的输出<2>每一趟排序的输出,即排序过程的输出"二设计说明算法设计思想<1>交换排序(冒泡排序、快速排序)交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。

<2>插入排序(直接插入排序、折半插入排序)%插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。

开始时建立一个初始的有序序列,它只包含一个数据元素。

然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。

<3>选择排序(简单选择排序、堆排序)选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。

等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。

<4>归并排序(两路归并排序)两路归并排序的基本思想是:假设初始排序表有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项),先做两两归并,得n/2上取整个长度为2的归并项(如果n为奇数,则最后一个归并项的长度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。

数据结构课程设计排序算法演示系统方案

数据结构课程设计排序算法演示系统方案

计算机学院数据结构课程设计题目:数据结构排序算法演示系统班级:姓名:学号:同组人姓名:起迄日期:课程设计地点:指导教师:评阅意见:成绩评定:评阅人:日期:完成日期:2014年12月目录一、课程设计的目的 (1)二、设计内容和要求 (1)三、数据采取的结构 (1)四、功能模块详细设计 (1)4.1 详细设计思想 (2)4.1.1 冒泡排序 (5)4.1.2 快速排序 (7)4.1.3 直接插入排序 (9)4.1.4 希尔排序 (10)4.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.1 详细设计思想主函数:#include<stdio.h>#include<stdlib.h>#include <math.h>#define L 8 //排序元素个数#define FALSE 0#define TRUE 1typedef struct{int key;}RecType;RecType R[L];int num;int sum;int sun; //定义排序趟数的全局变量//系统主界面//主函数int main(){RecType S[100];int i,k;char ch1,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");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);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'||ch 2=='8'){printf("\n\n\t\t排序完毕!");printf("\n\t\t按回车键继续!");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大的数据。

数据结构课程设计--排序综合

数据结构课程设计--排序综合

课程设计报告题目:排序综合院系:计算机科学与应用专业年级: 12级计科学号: 121096124学生姓名:平宁宁指导老师:薛海燕2013年6月10日目录一.设计任务书 (2)1.1题目与要求 (2)1.2设计知识点 (2)1.3预期目标 (2)二.概要设计 (2)2.1各种排序算法的特点 (2)2.1.1冒泡排序 (2)2.1.3简单选择排序 (3)2.1.4快速排序 (3)2.1.5 希尔排序 (3)2.1.6 堆排序 (3)2.2各种算法的比较方法 (4)2.2.1 稳定性比较 (4)2.2.2 时间复杂性比较 (4)2.2.3 辅助空间的比较 (4)2.2.4 其它比较 (4)三.详细设计 (4)3.1 流程图 (4)3.2流程图模块说明 (5)3.3可排序表的抽象数据类型定义 (5)3.4程序代码 (6)3.4.1 函数声明 (6)3.4.2 六种排序算法代码 (8)3.4.3 排序算法选择 (13)3.4.4 主函数程序代码 (15)四.调试分析 (19)4.1调试分析 (19)4.2输入输出 (19)4.3排序算法评价 (23)4.4经验和体会 (23)五.参考文献 (24)六.致谢 (24)一.设计任务书1.1题目与要求题目:排序综合要求:利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。

要求:1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。

并把排序后的结果保存在不同的文件中。

2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。

3)如果采用4种或4种以上的方法者,可适当加分。

1.2设计知识点1)本演示程序对以下6种常用的内部排序算法进行实测比较:冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序;2)待排序表的元素的关键字为整数。

排序系统设计数据结构课程设计

排序系统设计数据结构课程设计

数据结构课程设计题目:排序系统设计班级:姓名学号:同组人姓名:起迄日期: 2014.12.28-2015.01.04 课程设计地点:指导教师:完成日期:2014年12月目录一、问题描述 (3)二、概要设计 (4)三、详细设计 (6)四、程序调试与测试 (12)五、实验心得 (14)六、程序代码............................................................. 错误!未定义书签。

参考文献 (15)一、问题:1.题目13:排序系统设计功能:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。

开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。

如此下去,直到所有人全部出列为止。

令n最大值取30。

要求设计一个程序模拟此过程,求出出列编号序列。

1.分步实施:1初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2完成最低要求:建立一个文件,包括某人5个人的情况。

3进一步要求:有兴趣的同学可以自己扩充系统功能。

2.要求:1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4)要提供程序测试方案5) 程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

二、概要设计1、循环链表抽象数据类型定义typedef struct LNode//定义单循环链表中节点的结构{int num;//编号int pwd;//passwordstruct LNode *next;//指向下一结点的指针}LNode;2、本程序包含一下几个模块(1)构造结点模块LNode *createNode(int m_num,int m_pwd){LNode *p;p=(LNode *)malloc(sizeof(LNode));//生成一个结点p->num=m_num;//把实参赋给相应的数据域p->pwd=m_pwd;p->next=NULL;//指针域为空return p;}(2)创建链表模块void createList(LNode *ppHead,int n)(3)出队处理模块void jose(LNode *ppHead,int m_pwd)(4)约瑟夫环说明输出模块void instruction()(5)菜单模块void menu()(6)主函数模块int main()函数的调用关系图如下:三、详细设计1.主函数图4 主函数数据流程图根据流程图,主函数程序如下:int main(){int n,m,x;LNode *ppHead=NULL;menu();for(;;){printf("\n请选择要执行的操作:");scanf("%d",&x);system("cls");switch(x){case 1:printf("*************************************************************** *\n");printf("约瑟夫环:\n");printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");printf("按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码\n");printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");printf("直到所有人全部出列为止.编程打印出列顺序.\n");printf("*************************************************************** *\n");main();break;case 2:printf("\n请输入总人数n:");scanf("%d",&n);printf("请输入开始上限数m:");scanf("%d",&m);createList(&ppHead,n);printf("\n");printf("出队顺序:\n");jose(ppHead,m);printf("\n约瑟夫环游戏结束!\n");main();break;case 0:exit(0);default:system("cls");printf("\n您选择的操作有误,请重新选择...\n\n\n");main();}}return 0;}2.链表的创建图5 创建链表函数的数据流程图/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指向的数据元素为p,后续为"空"的节点,再把P插入循环链表ppHead中*/根据流程图,创建链表函数程序如下:void createList(LNode **ppHead,int n)int i,m_pwd;LNode *p,*cur;//cur:浮标指针for(i=1;i<=n;i++){printf("输入第%d个人的密码:",i);scanf("%d",&m_pwd);//输入持有密码p=createNode(i,m_pwd);//调用构造结点函数if(*ppHead==NULL)//如果头结点为空{*ppHead=cur=p;//生成头结点,让cur指向他cur->next=*ppHead;//cur的指针域指向自身}else//如果不为空,则插入结点{p->next = cur->next;cur->next = p;cur= p;//cur指向新插入结点}}printf("完成创建!\n"); //提示链表创建完成}3.出队处理图6 出队函数的数据流程图/*p指向要删除节点的前一个节点,ppHead指向要删除的节点,使p=ppHead,ppHead再指向要删除节点的下一个节点,使p和ppHead链接,输出p指向节点的编号和密码值,释放ppHead,如此循环,直至把所有节点都打印和删除为止!*/根据流程图,出队函数程序如下:void jose(LNode *ppHead,int m_pwd){int i,j;LNode *p,*p_del;//定义指针变量for(i=1;p!=ppHead;i++){for(j=1;j<m_pwd;++j){p=ppHead;//p赋值为ppHead,p指向要删除结点的前一个结点ppHead=ppHead->next;//ppHead指向下一个元素}p->next = ppHead->next;//p结点与头结点链接i=ppHead->pwd;//i赋值为ppHead->pwdj=ppHead->num;//j赋值为ppHead->num,j为要删除的密码值printf("第%d个人出列,密码:%d\n",j,i);m_pwd=ppHead->pwd;//m_pwd赋值为ppHead->pwdfree(ppHead);//释放头结点ppHead=p->next;//ppHead重新赋值给p->next,即释放前的ppHead->pwd 指针//删除报数结点}i=ppHead->pwd;//i赋值为ppHead->pwdj=ppHead->num;//j赋值为ppHead->numprintf("最后一个出列是%d号,密码是:%d\n",j,i);free(ppHead);//释放头结点}4. 约瑟夫环说明模块void instruction(){printf("*************************************************************** *\n");printf("约瑟夫环:\n");printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");printf("按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\n");printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");printf("直到所有人全部出列为止.编程打印出列顺序.\n");printf("******************************************************\n");return 0;}5. 菜单模块void menu(){printf("**************************约瑟夫环*****************************\n");printf("\n");printf(" [1]约瑟夫环问题的阐述\n");printf(" [2]按要求求解约瑟夫环\n");printf(" [0]退出\n");printf("************************** 欢迎使用!****************************\n");}四、程序调试与测试本程序开始运行界面如下:选择1进入问题。

数据结构课程设计 基数排序算法演示

数据结构课程设计  基数排序算法演示

目录1 需求分析 (3)2 概要设计 (3)2.1 存储结构设计说明 (3)2.2 主要算法流程图 (4)3 详细设计 (5)3.1算法设计 (5)3.2程序代码 (7)4 调试分析 (9)5 课设总结 (10)6 参考文献 (10)1 需求设计1、题目:基数排序算法演示2、说明:基数排序:通过LSD(最低为优先)法:先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的若干个堆,然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,直到用kn分配和收集之后,整个数据按多关键字位有序。

2 概要设计2.1存储结构设计说明typedef struct //定义数据在存储类型{int key;}data1; //类型标识符typedef struct //定义数据在存储类型{int key[d]; //用数组存放数据个位数、十位数、百位数……int next; //指针域指向下一个数据形成链表结构}data2; //类型标识符data1 R[max];data2 R1[max]; //新类型数据2.2主要算法流程2-2主要算法流程图3 详细设计3.1 算法设计(1)基数排序的“分配”与“收集”过程:第一趟:图3-1第一趟演示基数排序的“分配”与“收集”过程第二趟:图3-2第二趟演示基数排序的“分配”与“收集”过程第三趟:图3-3 收集分配图示(2)基数排序过程阐述:设有n个记录,d个关键字,rd为基数,通过LSD (最低为优先)法:初始化一系列的空队列,先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的相应队列。

然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,每一趟按一个关键值的位置记录分配到rd个队列中,同一链队列中的记录都是用链域指针链接起来的,所有的队头和队尾指针分别放在两个数组中,每一趟分配后通过修改指针将这个链队列中的记录收集起来;直到用kn分配和收集之后,重复分配和收集d趟,便得到了最终排序好的有序序列。

《数据结构》课程设计报告实验五 排序

《数据结构》课程设计报告实验五 排序

《数据结构》课程设计报告实验五排序一、需求分析:本演示程序用C++6.0编写,完成各种排序的实现,对输入的一组数字实现不同的排序方法,对其由小到大顺序输出。

(1)分别对直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序算法进行编写。

(2)、对存储的函数即输入的数字进行遍历。

(3)、初始化函数对输入的数字进行保存。

(4)、主函数实现使用者操作界面的编写,对输入、选择、保存、输出的各种实现。

这当中还包括了各个函数的调用的实现。

(5)、程序所能达到的功能:完成对输入的数字的生成,并通过对各排序的选择实现数字从小到大的输出。

二、程序主要功能以及基本要求:(1)、设计一个菜单,格式如下:1、直接插入排序2、希尔排序3、冒泡排序4、快速排序5、选择排序6、堆排序7、退出(2)、选择不同的菜单但进行相应的排序,并给出排序的关键字序列。

三、系统框架图:本程序包含了9个函数,它们分别是:(1)、直接插入排序的算法函数InsertSort ()。

(2)、希尔排序的算法函数(3)、冒泡排序算法函数(4)、快速排序的算法函数(5)、选择排序算法函数(6)、堆排序算法函数(7)、对存储数字的遍历函数(8)、初始化函数InitSqList()。

(9)、主函数main()。

四、详细设计实现各个算法的主要内容,下面是各个函数的主要信息:(1)各个排序函数的算法:一、直接插入排序void InsertSort(SqList &L){int i,j;for( i=2; i<=L.length;i++){if(L.r[i].key < L.r[i-1].key){L.r[0] = L.r[i];L.r[i] = L.r[i-1];for( j=i-2; (L.r[0].key < L.r[j].key); j--)L.r[j+1] = L.r[j];L.r[j+1] = L.r[0];}}}二、希尔排序void ShellSort(SqList &L){int i, j;int dk = 1;//增量while(dk <=L.length/3)dk = 3*dk+1;//增大增量while(dk>0){dk /= 3;//减小增量for (i = dk; i <=L.length; i++){L.r[0].key = L.r[i].key;j = i;while ((j >= dk) &&(L.r[j-dk].key > L.r[0].key)){L.r[j].key = L.r[j-dk].key;j -= dk;}L.r[j].key = L.r[0].key;}}}三、冒泡排序void BubbleSort(SqList &L){int i,j;for(i=0;i<L.length-2;i++){int flag = 1;for(j=0;j<L.length-i-2;j++)if(L.r[j].key > L.r[j+1].key){flag = 0;int temp;temp = L.r[j].key;L.r[j].key = L.r[j+1].key;L.r[j+1].key = temp;}//若无交换说明已经有序if(flag==1)break;}}四、快速排序int Partition(SqList &L,int low,int high){//分割区域函数L.r[0] = L.r[low];int pivotkey = L.r[low].key;//一般将顺序表第一个元素作为支点while(low < high){while(low<high &&L.r[high].key>=pivotkey)high--;L.r[low] = L.r[high];while(low<high &&L.r[low].key<=pivotkey)low++;L.r[high] = L.r[low];}L.r[low] = L.r[0];//返回枢轴位置return low;}void QSort(SqList &L,int low,int high){//每张子表的快速排序if(low<high){int pivotloc =Partition(L,low,high);QSort(L,low,pivotloc-1);QSort(L,pivotloc+1,high);}}void QuickSort(SqList &L){QSort(L,1,L.length);}五、简单选择排序void SelectSort(SqList &L){int min;int j;for (int i = 0; i <L.length; i++){ // 选择第i小的记录,并交换j = i;min = L.r[i].key;for (int k = i; k < L.length; k++){ // 在R[i..n-1]中选择最小的记if (L.r[k].key < min){min = L.r[k].key ;j = k;}}if (i != j){ // 与第i个记录交换int temp = L.r[i].key;L.r[i].key = L.r[j].key;L.r[j].key = temp;}}}六、堆排序void HeapAdjust(HeapType &H,int s,int m){//堆调整,将记录调整为小顶堆int j;RedType rc = H.r[s];//暂时存储根结for(j=2*s; j<=m; j*=2){//沿着结点记录较小的向下筛选if(j<m &&H.r[j].key<H.r[j+1].key)++j;if(rc.key>= H.r[j].key)break;H.r[s] = H.r[j];s = j;}H.r[s] = rc;}void HeapSort(HeapType &H){int i;RedType temp;for(i = H.length; i>0; --i)HeapAdjust(H,i,H.length);for(i=H.length; i>1; --i){temp = H.r[1];H.r[1] = H.r[i];H.r[i] = temp;HeapAdjust(H,1,i-1);}}(2)遍历函数与初始化void Visit(SqList L){for(int i=1; i<=L.length; i++)cout<<L.r[i].key<<" ";cout<<endl;}void InitSqList(SqList &L,int a[]){for(int i=1;i<=L.length;i++)L.r[i].key = a[i];}五、测试结果以下是各种界面的测试结果:(1)输入的界面:(2)排序操作界面:(3)各种排序的结果:六、设计不足以及存在问题本程序是基于C++6.0的实现,其实在设计上的改进可以利用类进行操作,这种类的改进了存储上的不足还可以实现了,对各种的函数基于类的实现,这就是对本程序的改进,这是十分重要的与是改进的基础。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机学院数据结构课程设计题目:数据结构排序算法演示系统班级:姓名:学号:同组人姓名:起迄日期:课程设计地点:指导教师:评阅意见:成绩评定:评阅人:日期:完成日期:2014年12月目录一、课程设计的目的 (1)二、设计内容和要求 (1)三、数据采取的结构 (1)四、功能模块详细设计 (1)4.1 详细设计思想 (2)4.1.1 冒泡排序 (5)4.1.2 快速排序 (7)4.1.3 直接插入排序 (9)4.1.4 希尔排序 (10)4.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.1 详细设计思想主函数:#include<stdio.h>#include<stdlib.h>#include <math.h>#define L 8 //排序元素个数#define FALSE 0#define TRUE 1typedef struct{int key;}RecType;RecType R[L];int num;int sum;int sun; //定义排序趟数的全局变量//系统主界面//主函数int main(){RecType S[100];int i,k;char ch1,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");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);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'||ch 2=='8'){printf("\n\n\t\t排序完毕!");printf("\n\t\t按回车键继续!");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("\n\t\t原始数据为(按回车键开始排序):\n\t\t");for(k=1;k<=L;k++){printf("%5d",R[k].key);}getchar();printf("\n");for(i=1;i<L&&exchange==TRUE;i++)//外层对总的循环次数执行次数{exchange=FALSE;for(j=1;j<=L+1-i;j++) //内层相邻记录的交换与比较{ m++;//比较次数++if(R[j].key<R[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);}}图二直接插入排序4.1.2 快速排序核心思想首先检查数据列表中的数据数,如果小于两个,则直接退出程序。

如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。

通常分割点的数据是随机选取的。

这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。

而只要两个子列表的大小差不多核心代码//递归算法实现void Quicksort(int low,int high){int i=low,j=high,k;R[0].key=R[low].key;while(i<j){while(i<j&&R[0].key<=R[j].key) //右侧扫描{j--;sum++;}if(i<j){ R[i].key=R[j].key;//交换i++;sun++;}while(i<j&&R[i].key<R[0].key)//左侧扫描{i++;sum++;}if(i<j){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(low<i-1) Quicksort(low,i-1);//递归部分(左侧)if(j+1<high) Quicksort(j+1,high);//递归部分(右侧) }图三快速排序4.1.3 直接插入排序核心思想经过i-1遍处理后,L[1..i-1]己排好序。

相关文档
最新文档