武汉理工大学数据结构课程设计排序算法比较.docx
- 文档编号:9041801
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:28
- 大小:400.75KB
武汉理工大学数据结构课程设计排序算法比较.docx
《武汉理工大学数据结构课程设计排序算法比较.docx》由会员分享,可在线阅读,更多相关《武汉理工大学数据结构课程设计排序算法比较.docx(28页珍藏版)》请在冰豆网上搜索。
武汉理工大学数据结构课程设计排序算法比较
学号:
课程设计
课程名称
数据结构
题目
排序码的比较次数、记录移动次数的定量分析
学院
计算机科学与技术学院
专业
软件工程
班级
姓名
指导教师
李晓红
2013
年
12
月
24
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
李晓红工作单位:
计算机科学与技术学院
题目:
排序码比较次数、记录移动次数的定量分析
初始条件:
理论:
学习了《数据结构》课程,掌握了一种计算机高级语言。
实践:
计算机技术系实验中心提供计算机及软件开发环境。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、系统应具备的功能:
(1)选择书中3~5个排序算法,对它们稍作修改,即在算法中插入关于排序码比较次数和元素移动次数的统计语句。
用修改后的排序算法对同一个随机数序分别进行排序,统计排序过程中排序码的比较次数和元素的移动次数。
(2)至少分析5组排序码。
每组排序码由键盘输入或者随机函数产生。
2、数据结构设计;
3、主要算法设计;
4、编程及上机实现;
5、撰写课程设计报告,包括:
(1)设计题目;
(2)摘要和关键字(中文和英文);
(3)正文,包括引言、需求分析、数据结构设计、算法设计、有关技术的讨论、设计体会等;
(4)结束语;
(5)参考文献。
时间安排:
2013年12月16日-25日
12月19日查阅资料
12月20日确定功能和功能结构,数据结构设计,功能模块的算法设计
12月21—22日编程并上机调试
12月23日撰写报告
12月24日验收程序,提交设计报告书。
指导老师:
年月日
目录
摘要和关键字…………………………………………………………4
Abstract………………………………………………………………5
1引言…………………………………………………………………6
2需求分析……………………………………………………………7
2.1基础分析………………………………………………………7
2.2功能分析………………………………………………………7
3数据结构设计………………………………………………………8
3.1头文件…………………………………………………………8
3.2结构体定义……………………………………………………8
3.3功能函数的声明………………………………………………8
3.4主函数…………………………………………………………8
4算法设计……………………………………………………………10
4.1定义结构体……………………………………………………10
4.2输入函数………………………………………………………10
4.3输出函数………………………………………………………11
4.4直接插入排序…………………………………………………11
4.5拆半插入排序………………………………………………12
4.6简单选择排序…………………………………………………13
4.7冒泡排序………………………………………………………14
4.8快速排序………………………………………………………14
5运行结果……………………………………………………………16
5.1初始界面……………………………………………………16
5.2第一次排序…………………………………………………16
5.3第二次排序…………………………………………………17
5.4第三次排序…………………………………………………19
5.5第四次排序…………………………………………………20
5.6第五次排序…………………………………………………21
5.7退出界面……………………………………………………23
6有关技术的讨论……………………………………………………24
7设计体会……………………………………………………………25
结束语…………………………………………………………………26
附:
参考文献…………………………………………………………26
摘要:
本程序的主要功能是排序码比较次数、记录移动次数的定量分析。
通过对同一组任意次序的数据进行五种不同方法的排序,我们可以得到排序码的比较次数和元素的移动次数,进而比较得出不同排序法的优劣。
本程序是以面向对象程序设计语言C++在VC++6.0中编译通过的。
关键词:
结构体;直接插入排序;拆半插入排序;简单选择排序;冒泡排序;快速排序
Abstract:
Themainfunctionofthisprogramistoanalyzethecomparingnumberofsortcodesandrecordingnumberofmovesquantitatively.Throughthesamesetofdatainanyordertosortbyfivedifferentmethods,wecangetthenumberofcomparisonofthesortcodesandmovesoftheelements,andthencomparetheadvantagesanddisadvantagesofthedifferentsortmethods.Thisprogramisbasedonobject-orientedprogramminglanguageC++andpassedinVC++6.0compiler.
Keyword:
Structure;StraightInsertionSort;BinaryInsertionSort;
SimpleSelectSort;BubbleSort;QuickSort
1引言
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。
包含有很多分支,比如线性表、基于线性表的栈和队列、串、数组和广义表、树和二叉树、图、查找、排序等等。
数据结构主要是进行一个程序的数据结构设计和算法设计,对实现细节没有特别的强调。
本次课程设计就是主要运用排序的相关算法实现的。
排序是运用很广泛的算法,主要分为内部排序和外部排序两大类。
本程序主要是对五种不同的内部排序方法对同一组数组的分别排序,统计排序码的比较次数和元素的移动次数,最后得出不同排序方法的优劣。
2需求分析
2.1基础分析
根据要求,系统应该具备以下两种功能:
1.选择书中3~5个内部排序的算法,并对它们稍作修改,即在算法中插入关于排序码比较次数和元素移动次数的统计的语句。
并用修改后的排序算法对同一个随机数序分别进行排序,统计在此次排序过程中排序码的比较次数和元素的移动次数。
2.至少要分析5组排序码,且每组排序码由键盘输入或者随机函数产生。
2.2功能分析
针对基本需求,分析程序应具备的功能如下:
1.建立一个共同的输入函数和输出函数,输入可选择电脑产生随机数和从键盘输入排序码两种方式输入,再排序码复制4次得到5个数组存储5组相同的数据供5种排序方法使用,排序完成后,统一输出。
2.通过#define设置排序码的组数,按需要可以选择至少大于五组排序码的排序。
在主函数中通过for循环来分配排序码的存储空间,调用输入、排序和输出函数。
3.运用面向对象的特点,主要通过主函数调用来进行,不同的排序方法的代码相对比较独立,可以单独书写,最后细微改动使用统一的输入输出函数和主函数链起来。
4.通过清屏代码来管理结果输出页面,可以选择是否进行下一次操作,是程序使用更灵活,是结果显示更清晰美观。
3数据结构设计
3.1头文件
#include
usingnamespacestd;
#include
#include
3.2结构体定义
structRecordNode
{
intkey;//排序码字段
};
structSqList
{
intn;//n为数据的个数
RecordNode*record;
};
3.3功能函数与辅助函数的声明
voidInputData(intNn[],intMm[]);//待排序的记录关键码的输入
voidOutputData(SqList*L);//排序表的输出
voidInsSort(SqList*L,int&n,int&m);//直接插入排序
voidBInsertSort(SqList*L,int&n,int&m);//拆半插入排序
voidSelectSort(SqList*L,int&n,int&m);//简单选择排序
voidBubbleSort(SqList*L,int&n,int&m);//冒泡排序
intPartition(SqList*L,intlow,inthigh,int&n,int&m);//快速排序交换顺序表
voidQsort(SqList*L,intlow,inthigh,int&n,int&m);//快速排序,将数据一分为二
voidQuickSort_prin(SqList*L,int&n,int&m);//快速排序的输出
3.4主函数
voidmain()
{
cout<<"****************************************"< cout<<"排序码比较次数、记录移动次数的定量分析"< cout<<"****************************************"< cout< cout<<"开始排序请按1! "< cout<<"退出程序请按0! "< intz; cin>>z; if(z==0){ cout<<"****************************************"< cout<<"退出排序"< cout<<"****************************************"< exit(-1); } else { system("cls"); intn[N]; intm[N]; for(inti=0;i { system("cls"); cout<<"第"< "< Print(n,m); intn_min=0; intm_min=0; for(intj=1;j { if(n[j] n_min=j; if(m[j] m_min=j; } cout<<"本排序中,排序码比较次数最少的是第"< cout<<"本次排序中,元素移动的次数最少的是第"< cout< cout<<"继续排序请按1! "< cout<<"退出程序请按0! "< intf; cin>>f; if(f! =1)break; } } system("cls"); cout<<"****************************************"< cout<<"排序结束"< cout<<"****************************************"< } 4算法设计 4.1定义结构体 structRecordNode { intkey;//排序码字段 }; structSqList { intn;//n为数据的个数 RecordNode*record; }; }; 4.2输入函数 从键盘获取所需记录的排序码长度和排序码,复制4次。 voidInputData(intNn[],intMm[]) { SqList*L[N]; inti,n,z; for(i=0;i L[i]=newSqList; cout<<"请输入所需排序数字的长度: "; cin>>n; for(i=0;i { L[i]->n=n; L[i]->record=newRecordNode[n]; } cout<<"选择产生随机数请选择9! "< cout<<"选择从键盘输入请选择10! "< intw; cin>>w; if(w==10) { cout<<"请输入待排序的"< "; for(z=0;z { cin>>L[0]->record[z].key; for(intj=1;j L[j]->record[z].key=L[0]->record[z].key; //将输入的数存在数组中,并复制4次,供后面的4种排序法使用 } } else { intz; cout<<"随机产生了"< "; cout< srand((unsigned)time(NULL)); for(z=0;z { L[0]->record[z].key=rand();//随机产生样本整数 printf("%7.2d",L[0]->record[z].key); for(intj=1;j L[j]->record[z].key=L[0]->record[z].key; } cout< } InsSort(L[0],Nn[0],Mm[0]); BInsertSort(L[1],Nn[1],Mm[1]); SelectSort(L[2],Nn[2],Mm[2]); bubbleSort(L[3],Nn[3],Mm[3]); QuickSort_prin(L[4],Nn[4],Mm[4]); } 4.3输出函数 通过一个for循环输出排序码。 voidOutputData(SqList*L) { cout< cout<<"完成排序后的有序表: "; for(inti=0;i cout< cout< cout< } 4.4直接插入排序 voidInsSort(SqList*L,int&n,int&m) { n=0,m=0; RecordNodetemp; for(inti=1;i { if(L->record[i].key { temp.key=L->record[i].key;//复制为哨兵,将要移动的数存在temp中 for(intj=i-1;temp.key { L->record[j+1].key=L->record[j].key;//记录后移 n++; m++; } L->record[j+1].key=temp.key;//插入到正确位置 n++; m++; } n++; } cout< cout<<"1: 直接插入排序: "; cout<<"排序码的比较次数: "< "< OutputData(L); } 4.5折半插入排序 voidBInsertSort(SqList*L,int&n,int&m) { inti,j,mid,low,high; n=0;m=0; RecordNodetemp; for(i=1;i { temp.key=L->record[i].key;//暂存 low=0; high=i-1; while(low<=high)//在[low..high]中折半查找有序插入的位置 { mid=(low+high)/2; if(temp.key { high=mid-1; } else { low=mid+1;//插入点在高半区 } n++; m++; }//while for(j=i-1;j>=high+1;j--)//插入点后的数据后移 { L->record[j+1].key=L->record[j].key; m++; } L->record[high+1].key=temp.key;//将数据插入 }//for cout<<"2: 拆半插入排序: "; cout<<"排序码的比较次数: "< "< OutputData(L); } 4.6简单选择排序 voidSelectSort(SqList*L,int&n,int&m) { n=0,m=0; inti,j,k; for(i=0;i { k=i; for(j=i+1;j { if(L->record[j].key k=j; n++; } if(k! =i) { RecordNodetemp; temp.key=L->record[i].key; L->record[i].key=L->record[k].key; L->record[k].key=temp.key; m++; } } cout<<"3: 简单选择排序: "; cout<<"排序码的比较次数: "< "< OutputData(L); } 4.7冒泡排序 voidbubbleSort(SqList*L,int&n,int&m) { n=0,m=0;//n为排序码比较次数,m为元素移动次数 RecordNodetemp; intflag=1;//当flag为0时则停止排序 for(inti=L->n-1;i>1;i--)//i为趟数,最多为n-1次 { flag=0;//开始时元素为交换 for(intj=1;j<=i;j++)//置交换标志 { n++; if(L->record[j].key { temp=L->record[j]; L->record[j]=L->record[j-1]; L->record[j-1]=temp; flag=1; m++; } } if(flag==0)break; } cout<<"4: 起泡排序法: "; cout<<"排序码的比较次数: "< "< OutputData(L); } 4.8快速排序 intPartition(SqList*L,intlow,inthigh,int&n,int&m) //交换顺序表中子表[low..high]的记录,使得枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大于它 { RecordNodetemp; RecordNodepivotkey; pivotkey.key=L->record[low].key;//用子表的第一个纪录作枢轴纪录 temp.key=L->record[low].key;//用枢轴纪录关键字 while(low { while(low { high--; n++; } L->record[low].key=L->record[high].key;//将比枢轴记录小的记录移到低端 while(low { low++; n++; } L->record[high].key=L->record[low].key;//将比枢轴记录大的数移到高端 m++; } L->record[low].key=temp.key;//枢轴记录到位 returnlow; }//Partition函数 voidQsort(SqList*L,intlow,inthigh,int&n,int&m) { RecordNodepivotkey; if(low { pivotkey.key=Partition(L,low,high,n,m);//将[low...high]一分为二 Qsort(L,low,pivotkey.key-1,n,m);//对低子表递归排序,temp.key是枢轴位置 Qsort(L,pivotkey.key+1,high,n,m);//对高子表递归排序 } }//Qsort函数 voidQuickSort_prin(SqList*L,int&n,int&m) { n=0;m=0; Qsort(L,0,L->n-1,n,m)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉理工大学 数据结构 课程设计 排序 算法 比较
![提示](https://static.bdocx.com/images/bang_tan.gif)