排序算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验课程:算法分析与设计
实验名称:几种排序算法的平均性能比较(验证型实验)
实验目标:
(1)几种排序算法在平均情况下哪一个更快。
(2)加深对时间复杂度概念的理解。
实验任务:
(1)实现几种排序算法(selectionsort, insertionsort,bottomupsort,quicksort, 堆排序)。对于快速分类,SPLIT中的划分元素采用三者A(low),A(high),A((low+high)/2)中其值居中者。(2)随机产生20组数据(比如n=5000i,1≤i≤20)。数据均属于范围(0,105)内的整数。对于同一组数据,运行以上几种排序算法,并记录各自的运行时间(以毫秒为单位)。(3)根据实验数据及其结果来比较这几种分类算法的平均时间和比较次数,并得出结论。实验设备及环境:
PC;C/C++等编程语言。
实验主要步骤:
(1)明确实验目标和具体任务;
(2)理解实验所涉及的几个分类算法;
(3)编写程序实现上述分类算法;
(4)设计实验数据并运行程序、记录运行的结果;
(5)根据实验数据及其结果得出结论;
(6)实验后的心得体会。
一:问题分析(包括问题描述、建模、算法的基本思想及程序实现的技巧等):1:随机生成n个0到100000的随机数用来排序的算法如下.
for(int n=1000;n<20000;n+=1000)
{
int a[]=new int[n];
for(int i=0;i a[i]=(int) (Math.random()*100000); } 2.计算时间的类Date通过它的对象d1的getTime()得到当前时间,再得到排序完成时的时间,相减得到排序所花的时间. Date d1=new Date(); T=d2.getTime()-d1.getTime() 3:排序算法:其它count均表示排序中比较的次数. 插入排序主要算法如下 int count=0; int c[]=new int[b.length]; c[0]=b[0];int j; for(int i=1;i { for(j=i-1;j>=0&&b[i] { count++; c[j+1]=c[j]; } count++; c[j+1]=b[i]; } 选择排序主要算法: int count=0; for(int i=0;i { int k=i; for(int j=i+1;j {count++;if (b[j] if(k!=i) {int l;l=b[i];b[i]=b[k];b[k]=l;} } 合并排序: static int merge(int a[],int st,int ce,int fi) {int count=0; //a表示数组,st表示要排序的数据的起点,ce表示第一部分的终点也是第二部分的起点,fi表示第二部份的终点 int i=st; int j=ce; int cp=0; //由于数组c从0开始,而a是从st开始,并不一定是0.故要通过cp来表示c 的第cp个值. int c[]=new int[fi-st]; for(;i for(;j if(a[i]>a[j]) { count++; c[cp]=a[j]; cp++; } else break; } c[cp]=a[i]; cp++; } //若j的值还小于fi则继续把j到fi的值复制给c.此处也与书上的不同,主要由自己的理解来实现 for(;j { c[cp]=a[j]; cp++; } //把得到的值复制到a数组上 for(int k=0;k { a[st]=c[k]; st++; } return count; } 快速排序:用的方法与书上略有不同,主要通过spilt直接进行递归. static int spilt(int a[],int low,int high){ int count=0; int i=low; int x=a[low]; for(int j=low+1;j<=high;j++){ if(a[j]<=x){ count++; i=i+1; if(i!=j){ int temp=a[i]; a[i]=a[j]; a[j]=temp; } } } int temp= a[low]; a[low]=a[i]; a[i]=temp; int w=i; if(low if(w-1>low)count=count+spilt(a,low,w-1); //此处的if语句可以减少很多不必要的排序,例如只剩下一个数字时就不必再用spilt来排序了. if(w+1 } return count; } 二:实验数据及其结果(可用图表形式给出): 排序个 插入排序选择排序合并排序快速排序堆排序 数 比较次数时间比较次数时间比较次数时间比较次数时间比较次数时间1000 246415 3毫秒499500 2毫秒4292 1毫秒6042 0毫秒5336 1毫秒