各种内排序算法的实现及性能的比较_第1页
各种内排序算法的实现及性能的比较_第2页
各种内排序算法的实现及性能的比较_第3页
各种内排序算法的实现及性能的比较_第4页
各种内排序算法的实现及性能的比较_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实 验 报 告(2015/2016学年 第2学期)课程名称数据结构A实验名称各种内排序算法的实现及性能的比较实验时间2016年6月20日指导单位计算机科学与技术系指导教师骆健学生姓名班级学号学院(系) 管理学院专 业信息管理与信息系统一、 问题陈述(1) 验证教材的各种内排序算法(2) 分析各种内排序算法的时间复杂度(3) 改进教材中的快速排序法,使得当子集和小于10个元素时改用直接插入排序(4) 使用随机数发生器产生大数据集合,运行上述 各排序算法,使系统时钟测量个算法所需的实际时间,并进行比较。系统时钟包含在头文件“time.h”中。二、概要设计Main.cpp调用Menu.h ,为主程序

2、。Menu.h主菜单Selectsort.h简单选择排序Insertsort.h直接插入排序Bubblesort.h冒泡排序Quicksort.h快速排序Mergesort.h合并排序三、详细设计简单选择排序:将初始序列(A0An-1)作为待排序序列,第一趟在待排序序列(A0An-1)中找最小元素,与该序列中第一个元素A0交换,这样子序列(A0)有序,下一趟排序在带牌子序列(A1An-1)中进行。第i趟排序子序列(Ai-1An-1)中进行。经过n-1趟排序后使得初始序列有序。程序流程图:开始i=0i<n-1Small=ij=i+1j<nAj<AsmallSmall=jSwap

3、(Ai,Asmall)j+结束NNNYYi+直接插入排序:一个元素插入到有序表中,首先将其存入临时变量temp,然后从后往前查找插入位置。当temp小于表中元素时,就将该元素后移一个位置,继续比较、移动,直到temp大于等于表中元素或者到了有序表的第一个元素结束,这时就可将temp存入刚后移的元素的位置了。程序流程图:开始i<nint j=iT temp=Aij>0&&temp<Aj-1Aj=Aj-1;j-Aj=tempi+结束NYYN冒泡排序:第一趟在序列(A0An-1)中从前往后进行两个相邻元素的比较,若后者小,则交换,比较n-1次;第一趟排序结束,最大元

4、素被交换到An-1中(即沉底)下一趟排序只需在子序列(A0An-2)中进行;如果在某一趟排序中未进行交换元素,说明子序列已经有序,则不再进行下一趟排序。程序流程图:开始i=n-1i>0last=0;j=0j<iAj+1<AjSwap(Aj,Aj+1)Last=ji=last结束NNYY快速排序:取第一个元素作为分割元素,初始化i=left,j=right+1,i从左往右寻找第一个大于等于分割元素的元素,j从右往左找第一个小于等于分割元素的元素并交换,i和j继续移动,重复上述步骤,直到当i>=j时将j与第一个元素交换。程序流程图:开始left<righti=left

5、;j=righti+Ai<Aleftj-Aj>Alefti<jSwap(Ai,Aj)i<jSwap(Aleft,Aj)Qsort(A,left,j-1)Qsort(A,j+1,right)结束NYYNYNNYYN两路合并排序:将有n 个元素的序列看成是n个长度为1的有序子序列,然后两两合并子序列,得到n/2个长度为2或1的有序子序列,再两两合并直到得到一个长度为n的有序序列时结束。程序流程图:开始int size=1Size<ni1=1i1+size<ni2=i1+sizej1=i2-1i2+size-1>n-1j2=n-1Merge(A,i1,j1,

6、i2,j2)i1=j2+1size*=2结束j2=i2+size-1NYYNNY四、程序代码selectsort.h#include <iostream.h>/简单选择排序template <class T>void SelectSort(T A, int n) int small;for (int i=0; i<n-1; i+) small=i;for(int j=i+1;j<n;j+)if(Aj<Asmall)small=j;Swap(Ai,Asmall);Insertsort.h#include <iostream.h>/直接插入排序

7、template <class T>void InsertSort(T A, int n) for(int i=1; i<n; i+) int j=i;T temp=Ai;while(j>0&&temp<Aj-1)Aj=Aj-1;j-;Aj=temp;/*ok!*/Bubblesort.h#include <iostream.h>template <class T>void BubbleSort(T A, int n) int i,j,last; i=n-1; while(i>0) last=0; for(j=0;j&

8、lt;i;j+) if(Aj+1<Aj) Swap(Aj,Aj+1); last=j; i=last; Quicksort.h#include <iostream.h>/改进的快速排序template<class T>void quick(T A,int n)int *a; int top=0,right,left,j; a=new intn;if(a=NULL) return;atop+=0;atop+=n-1; /lcfor(j=0;aj!=NULL;j+) left=aj+;right=aj; if(left>right)Swap(left,right

9、); if(right-left<15)InsertSortExt(A,left,right); elseatop+=left; atop+=QuickSort(A,left,right)-1;atop+=atop-2+2;atop+=right; template<class T>int QuickSort(T A,int left,int right) int i,j;if(left<right)i=left;j=right+1;dodo i+;while(Ai<Aleft);do j-;while(Aj>Aleft);if(i<j)Swap(Ai

10、,Aj);while(i<j);Swap(Aleft,Aj);return j;return 0;template<class T>void InsertSortExt(T A,int left,int right) for(int i=left+1; i<right; i+) int j=i;T temp=Ai; while (j>0 && temp<Aj-1) Aj=Aj-1; j-; Aj=temp; Mergesort.h#include <iostream.h>/两路合并的C+程序template <class T

11、>void Merge(T A,int i1,int j1,int i2,int j2) T *Temp=new Tj2-i1+1; int i=i1,j=i2,k=0; while(i<=j1&&j<=j2)if(Ai<=Aj)Tempk+=Ai+;else Tempk+=Aj+;while(i<=j1)Tempk+=Ai+;while(j<=j2)Tempk+=Aj+;for(i=0;i<k;i+)Ai1+=Tempi;delete Temp; /合并排序的C+程序template <class T>void Merge

12、Sort(T A, int n)int i1,j1,i2,j2; int size=1; while(size<n)i1=0;while(i1+size<n)i2=i1+size;j1=i2-1;if(i2+size-1>n-1)j2=n-1;else j2=i2+size-1;Merge(A,i1,j1,i2,j2);i1=j2+1;size*=2;Meau.h#include <iostream.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include

13、"selectsort.h"#include "insertsort.h"#include "bubblesort.h"#include "quicksort.h"#include "mergesort.h"#define SIZE 400#define TIMES 1000template <class T>class Menupublic:void printmenu();void selectsort();/简单选择排序void insertSort();/直接插入排序void

14、 bubbleSort();/冒泡排序void quickSort();/快速排序void mergeSort();/两路合并排序void childmenu();/子菜单1void childmenu2();/子菜单2void switcha();private:int a,b,c;template <class T>void Menu<T>:printmenu()cout<<"-内排序测试系统-"<<endl;cout<<" "<<endl<<endl<<

15、endl;cout<<"1.简单选择排序"<<endl;cout<<"2.直接插入排序"<<endl;cout<<"3.冒泡排序"<<endl;cout<<"4.快速排序"<<endl;cout<<"5.两路合并排序"<<endl;cout<<"6.退出"<<endl;this->switcha();template <c

16、lass T>void Menu<T>:childmenu()cout<<"-"<<endl;cout<<"1.最好情况"<<endl;cout<<"2.最坏情况"<<endl;cout<<"3.平均情况"<<endl;cout<<"4.返回主菜单"<<endl;cin>>b;if(b=4)this->printmenu();template

17、<class T>void Menu<T>:childmenu2()cout<<"-"<<endl;cout<<"1.原始算法"<<endl;cout<<"2.改进算法"<<endl;cout<<"3.返回主菜单"<<endl;cin>>c;if(c=3)this->printmenu();template <class T>void Menu<T>:sw

18、itcha()/cout<<"ok"<<endl;cin>>a;switch(a)case 1:this->selectsort();break;/okcase 2:this->insertSort();break;/okcase 3:this->bubbleSort();break;/okcase 4:this->quickSort();break;/okcase 5:this->mergeSort();break;/okcase 6:exit(1);break;default:cout<<&q

19、uot;error"<<endl;this->printmenu();break;template <class T>void printout(T A,int n)/打印数组,测试时用for(int i=0;i<n;i+)cout<<Ai<<" "cout<<endl;template <class T>T *producedate(int x)/产生顺序,逆序,随机的数组int i;T *A=new TSIZE;switch(x)case 1:for(i=0;i<SIZE

20、;i+)Ai=i;return A;/顺序break;case 2:for(i=SIZE;i>0;i-)Ai-1=SIZE-i;return A;/逆序break;case 3:srand(time(NULL);for(i=0;i<SIZE;i+)Ai=rand()%1000+1;return A;/随机break;default:cout<<"error"<<endl;return A;break;template <class T>void Swap(T &a,T &b)/交换2个元素T temp=a;a=

21、b;b=temp;template <class T>void Menu<T>:bubbleSort()cout<<"冒泡排序"<<endl;this->childmenu();T *A;double duration;clock_t start,finish;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(b);BubbleSort(A,SIZE);delete A

22、;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;/printout(A,SIZE);cout<<"用时: "<<duration<<endl;system("pause");/delete A;this->bubbleSort();/*ok*/template <class T>void Menu<T>:insertSort()cout<<"直接插入排序"<<endl;

23、this->childmenu();T *A;double duration;/A=producedate<T>(b);/if(A=NULL)cout<<"error"delete A;this->insertSort();/printout(A,SIZE);clock_t start,finish;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(b);InsertSort(A,SIZ

24、E);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;/printout(A,SIZE);cout<<"用时: "<<duration<<endl;system("pause");/delete A;this->insertSort();template <class T>void Menu<T>:mergeSort()/this->childmenu();cout<<"

25、;合并排序"<<endl;cout<<"直接用随机数据测试"<<endl;T *A;double duration;clock_t start,finish;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);MergeSort(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PE

26、R_SEC;/printout(A,SIZE);cout<<"用时: "<<duration<<endl;system("pause");/delete A;this->printmenu();/*ok*/template<class T>void Menu<T>:quickSort()this->childmenu2();T *A;double duration;clock_t start,finish;if(c=1)cout<<"原始快速排序"&l

27、t;<endl;cout<<"直接用随机数据测试"<<endl;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);quick(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;cout<<"用时: "<<duration<<e

28、ndl;system("pause");this->quickSort();else if(c=2)cout<<"改进的快速排序"<<endl;cout<<"直接用随机数据测试"<<endl;/*A=producedate<T>(3);printout(A,SIZE);quick(A,SIZE);printout(A,SIZE);delete A;this->printmenu();*/T *A;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);quick(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论