排序算法比较
更新时间:2023-09-19 06:23:01 阅读量: 小学教育 文档下载
课程设计说明书
设计名称: 数据结构课程设计
题 目: 排序算法比较
学生姓名:
专 业: 计算机科学与技术 班 级: 11级一班 学 号:
指导教师: 李娅 日 期: 2013 年 3 月 20 日
1
课程设计任务书
计算机科学与技术 专业 11 年级 班 一、 设计题目 各种算法排序比较 二、 主要内容
利用随机函数产生N个随机整数(N<10000),对这些数进行多种方法排序。
三、 要求
1)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结果保存在不同的文件里。
2)给出该排序算法对数据的比较次数和移动次数并统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。
四、 进度安排
1)资料阅读查找、系统分析,概要设计;时间安排0.5天 2)系统详细设计、功能设计;时间安排0.5天 3)算法实现、编程调试;时间安排1天
4)资料整理、课程设计说明书编写。时间安排1天 五、 完成后应上交的材料
给出系统的概要设计、详细设计;完成核心算法的实现;完成规范化的课程设计说明书的编写。
课程设计的总结报告,还应包括以下内容:
1
(1)课程设计中遇到的主要问题和解决方法; (2)创新和得意之处;
(3)课程设计存在的不足,需进一步改进的设想; (4)课程设计的感想和心得体会。
以上内容均填写在《课程设计说明书》上,要求干净整洁,符合课程设计的要求和规范。
六、 总评成绩
1
指导教师 签名日期 年 月 日
系 主 任 审核日期 年 月 日
1
目 录
排序算法比较
一、需求析..................................2 二、程序的主要能............................2 三、程序运行台..............................3 四、算法及时间复度..........................3 五、测试结果................................5 六、程序源代码..............................6 七、感想体会与总结.........................13
- 1 - 1
排序算法比较
一、主要内容:
利用随机函数产生N个随机整数(N<10000),对这些数进行多种方法排序。 具体要求:
1)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结果保存在不同的文件里。
2)给出该排序算法对数据的比较次数和移动次数并统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。
二、程序的主要功能
1.用户输入随机数的个数n
2.随机数在排序函数作用下进行排序
3.程序给出随机数的移动次数yd、比较次数bj、以及排序所用的时间。
三、程序运行平台
- 2 - 1
Visual C++ 6.0版本
四、算法及时间复杂度
(一)各个排序是算法思想:
(1)直接插入排序:将一个记录插入到已排好的有序表中,从而得
到一个新的,记录数增加1的有序表。
(2)折半插入排序:插入排序的基本插入是在一个有序表中进行查
找和插入,这个查找可利用折半查找来实现,即为折半插入排序。
(3)起泡排序:首先将第一个记录的关键字和第二个记录的关键字
进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。
(4)快速排序:通过一趟排序将待排记录分割成独立的两部分,其
中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。 (5)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选
出关键字最小的记录,并和第I(1<=I<=N)个记录交换。 (二)时间复杂度分析
- 3 - 1
排序算法 插入排序 冒泡排序 快速排序 选择排序 最差时间 O(n2) O(n2) O(n2) O(n2) 时间复杂度 O(n2) O(n2) O(n*log2n) O(n2) 是否稳定? 稳定 稳定 不稳定 稳定
10000个数据的时间比较:
算法名称 直接插入排序 折半插入排序 起泡排序 快速排序 选择排序 用时 0.25 0.219 0.704 0.016 0.39
五、测试结果
1、首先选择需要排序的数字个数,比如输入n=100
- 4 - 1
2、再选择用哪种方法进行排序,比如输入方法1
3、各种方法排序显示已排序方法的信息5
六、程序源代码
/**********************************************************************************************
第二题:排序算法比较
设计要求:利用随机函数产生N个随机整数(N = 500,1000,1500,2000,2500,…,30000),
利用直接插入排序、折半插入排序,起泡排序、快速排序、选择排序四种排序方法
(可添加其它排序方法)进行排序(并统计每一种排序所耗费的时间,比较次数,移动次数)
************************************************************************************************/ #include
- 5 - 1
typedef struct { Keytype r[MAXSIZE+1];//储存数值 int length;//数组大小 }Sqlist;
typedef struct { int NumberOfJudgement;//比较次数 int NumberOfMovement;//移动次数 double time;//排序所用时间 }S_time;
typedef struct { S_time Sort[4]; int n; }Sort_result;
/*****************排序结果****************/ void print(Sqlist* L) { int i; for(i=1;i<=L->length;i++) { printf(\第M个数%-5d|\ if(!(i%5)) printf(\ } }
/****************插入排序****************/ void InsertSort(Sqlist* L,Sort_result* T) { int i,j; for(i=2;i<=L->length;++i) { T->Sort[0].NumberOfJudgement++; if(L->r[i]
- 6 - 1
} L->r[j+1]=L->r[0]; } } }
/************希尔排序********************/
void ShellInsert(Sqlist* L,int dk,Sort_result* T) { int i,j; for(i=dk+1;i<=L->length;i++) { T->Sort[1].NumberOfJudgement++; if(L->r[i]
void Shellsort(Sqlist* L,int dlta[],int t,Sort_result* T) { int k; for(k=0;k }//shellsort /***********冒泡排序法*******************/ void Bubblesort(Sqlist* L,Sort_result* T) { int i,j,temp; for(i=1;i<=L->length;i++) { for(j=i+1;j<=L->length;j++) { T->Sort[2].NumberOfJudgement++; if(L->r[i]>L->r[j]) { - 7 - 1 T->Sort[2].NumberOfMovement++; temp=L->r[i]; L->r[i]=L->r[j]; L->r[j]=temp; } } } } /************快速排序********************/ int Partition(Sqlist* L,int low,int high,Sort_result* T) { int pivotkey; L->r[0]=L->r[low]; pivotkey=L->r[low]; while(low void Qsort(Sqlist* L,int low,int high,Sort_result* T) { int pivotloc; T->Sort[3].NumberOfJudgement++; if(low - 8 - 1 } } void Quicksort(Sqlist* L,Sort_result* T) { Qsort(L,1,L->length,T); } /***********选择排序方法*****************/ void sort(int* choose,Sqlist* L,Sort_result* T) { int i; clock_t start,end; FILE* fp; char sortname[4][50]={\插入排序\希尔排序\起泡排序\快速排序\ char fname[4][50]={\插入排序结果.txt\希尔排序结果.txt\起泡排序结果.txt\快速排序结果.txt\ int dlta[]={5000,2500,1250,625,313,167,79,39,23,1},t=10;//增量序列和数列大小 if(*choose!=5) { fp=fopen(fname[*choose-1],\ if(!fp) { printf(\打开文件失败\ exit(1); } } switch(*choose) { case 1: { printf(\现在开始插入排序\\n\ start=clock(); InsertSort(L,T); end=clock(); break; } case 2: { printf(\现在开始希尔排序\\n\ start=clock(); Shellsort(L,dlta,t,T); end=clock(); break; } - 9 - 1 case 3: { printf(\现在开始起泡排序\\n\ start=clock(); Bubblesort(L,T); end=clock(); break; } case 4: { printf(\现在开始快速排序\\n\ start=clock(); Quicksort(L,T); end=clock(); break; } case 5: { if(T->n==0) printf(\请先使用任意一种排序方法再查阅排序方法的信息\ else for(i=0;i<4;i++) { if(T->Sort[i].NumberOfJudgement) printf(\排序:移动元素次数:%d 判断次数:%d 所用时间:%lf\\n\ ,sortname[i],T->Sort[i].NumberOfMovement,T->Sort[i].NumberOfJudgement,T->Sort[i].time); } } } if(*choose==5) getchar(); else { T->Sort[*choose-1].time=(double)(end-start); T->n++; print(L);//显示排序结果 for(i=1;i<=L->length;i++) { fprintf(fp,\第M个数%-5d|\ if(!(i%5)) fprintf(fp,\ } fclose(fp); - 10 - 1 fp=NULL; getchar(); } getchar(); *choose=0; } /**************主函数********************/ int main() { Sqlist L;//存放待排序数值的数组 Sort_result T;//存放 排序的比较次数和移动次数 int i,a,choose=0,arr[MAXSIZE+1];// choose功能选择 srand(time(NULL)); printf(\请输入需要排序的数字个数:\ scanf(\ L.length=a;//取1-9999的随机数 printf(\ printf(\要排列%d个整数\\n\ printf(\ getchar(); for(i=1;i<=L.length;i++)//生成N个随机数 { L.r[i]=rand()000+1; } for(i=1;i<=L.length;i++)//把随机数组放到备份数组中 { arr[i]=L.r[i]; } for(i=1;i<=L.length;i++) { printf(\第M个数%-5d|\ if(!(i%5)) printf(\ } getchar(); for(i=0;i<4;i++)//初始化排序的比较次数和移动次数 { T.Sort[i].NumberOfJudgement=0; T.Sort[i].NumberOfMovement=0; } T.n=0; for(;;) { for(;choose<1||choose>6;) - 11 - 1 { system(\ printf(\================\\n\ printf(\插入排序 2.希尔排序 3.起泡排序 4.快速排序 5.显示已使用排序方法的信息 6.退出\\n\ printf(\================\\n\ printf(\请输入你需要功能的序号:\ scanf(\ if(choose<1||choose>6) printf(\请重新输入序号\\n\ if(choose==6) exit(0); } sort(&choose,&L,&T);//调用排序函数 if(choose!=5) { for(i=1;i<=L.length;i++) { L.r[i]=arr[i];//每次排序后恢复原始数据 } } } getchar(); return 0; } 七、 感想体会与总结 好的算法+编程技巧+高效率=好的程序。 1、做什么都需要耐心,做设计写程序则更需要耐心。一开始的时候,好不容易写好了程序,可是等最后调试的时候发现错误很隐蔽,就很费时间了。后来我先在纸上构思出函数的功能和参数,先把各小部分编好才编主函数,考虑好接口之后才动手编,这样就比较容易成功了。 2、做任何事情我决定都应该有个总体规划。之后的工作按照规划逐步展开完成。对于一个完整的程序设计,首先需要总体规划写 - 12 - 1 程序的步骤,分块写,分函数写,然后写完一部分马上纠错调试。而不是像我第一次那样,一口气写完,然后再花几倍的时间调试。一步步来,走好一步再走下一步。 3、感觉一开始设计结构写函数体现的是数据结构的思想,后面的调试则更加体现了人的综合素质,专业知识、坚定耐心、锲而不舍,真的缺一不可。 4、通过这次课设,不仅仅复习了C语言相关知识、 而且也了解并初步掌握了c++,通过这一次课程设计,磨练了我的意志,是我更有了自信心。 - 13 - 1
正在阅读:
排序算法比较09-19
中秋节吃月饼的寄意是什么03-30
上海市徐汇区2015届高三学习能力诊断(一模)历史试题 Word版含答案08-31
GSP 04 密闭空间进入程序03-14
浅谈云南职业烟农-现代农业03-03
鞍山钢铁集团公司老区铁矿山改扩建规划项目 - 图文10-20
车牌识别的matlab程序--(详细注释,并有使用注意点)11-30
- 通信原理实验报告
- 2016年上半年安徽省临床医学检验技术中级技师职称试题
- 传智播客刘意老师JAVA全面学习笔记
- 星级酒店客房部保洁服务标准与工作流程操作规范 - PA新员
- 算法竞赛入门经典授课教案第1章 算法概述
- 《微信公众平台架起家校互通桥》结题报告
- 2018年宁夏银川市高考数学三模试卷(理)Word版含解析
- 大学生创业基础 - 尔雅
- 2016年6月英语六级真题写作范文3套
- 中国磁性材料纸行业专项调查与发展策略分析报告(2015-2020)
- 云南省2018届高三普通高中学业水平考试化学仿真试卷二Word版缺答案
- 窗函数法设计低通滤波器
- 第三章 绩效考评方法与绩效管理模式
- 高等数学教案
- 个人独资合伙企业习题及答案
- 小学语文沪教版三年级上册第六单元第30课《想别人没想到的》公开课优质课教案比赛讲课获奖教案
- 曳引钢丝绳及其他曳引系统校核计算 - 图文
- 淮阴工学院管理学期末试卷7 - 图文
- 受力分析方法(1)
- 2013-2014学年陕西省西安市西工大附小五年级(上)期末数学试卷及解析
- 算法
- 排序
- 比较
- 五年级上册21圆明园的毁灭
- 钢结构预算编制课件
- 人教版小学二年级下册品德与生活期末测试题及答案
- 力学部分
- 2017-2018仁爱版八年级上册英语选择(精编含答案解析)
- 中小学会计岗位职责
- 化学竞赛胡波题
- 小升初数学应用题综合训练十五 人教版
- 船舶自动舵控制技术的发展
- 2017-2023年中国水体沼泽化控制行业市场监测与投资前景分析报告(目录)
- 重庆一中初2019届16-17学年(上)半期试题 - 数学
- 职业学校工作总结
- 课题:29《爱写诗的小螃蟹》
- 急性阑尾炎护理记录
- 专升本高等数学复习资料(含答案)
- 教科版六年级科学上册期中测试卷及答案解析
- 专题四 三角函数与复数
- 2014-2015第一学期导波光学期末考试试卷 - (A卷)
- 黄带考试题(100分值)
- 2018法宣在线必考内容试题题库及答案()