选择、冒泡、快速、归并、插入排序算法的运行时间比较

来源:互联网 发布:游戏机禁令 知乎 编辑:程序博客网 时间:2024/06/01 20:12

包括选择排序,冒泡排序,归并排序,快速排序,插入排序

代码如下:

#include <iostream>#include <ctime>#include <cmath>using namespace std;void selection (int a[],int n);//选择排序void bubble(int a[],int n);//冒泡void Merge(int a[],int low,int m,int high);void MergeSort(int a[],int low,int high);//归并int partition(int a[],int low,int high);void quick(int a[],int low,int high);//快速void insertSort(int a[],int n);//插入排序int save[20][100000];//用于储存生成的随机数int use[100000];//提取需要的部分来进行运算int main(){int n;int i,j,t,flag; double tsum1;//用于计算时间和for(i=0;i<20;i++)for(j=0;j<100000;j++)save[i][j]=rand();//生成随机数放到数组中,列为20行while(true){cout<<"请输入数组规模: ";    cin>>n;//选择tsum1=0;for(i=0;i<20;i++){for(j=0;j<n;j++){use[j]=save[i][j];//取数组中需要计算的部分//cout<<use[j]<<" ";}clock_t start, end;start = clock();//开始计时selection(use,n);end = clock();//结束计时tsum1=tsum1+(double)(end - start) / CLOCKS_PER_SEC;//累加每次运行的时间if(i==0)cout<<"选择排序运行时间:";cout<<(double)(end - start) / CLOCKS_PER_SEC<<"s ";}cout<<endl;cout<<"平均时间为:"<<tsum1/20<<"s"<<endl;cout<<endl;//冒泡以下代码除调用函数之外其他都相同,故注释如上tsum1=0;for(i=0;i<20;i++){for(j=0;j<n;j++){use[j]=save[i][j];//cout<<a[i]<<endl;}clock_t start, end;start = clock();bubble(use,n);end = clock();tsum1=tsum1+(double)(end - start) / CLOCKS_PER_SEC;if(i==0)cout<<"冒泡排序运行时间:";cout<<(double)(end - start) / CLOCKS_PER_SEC<<"s ";}cout<<endl;cout<<"平均时间为:"<<tsum1/20<<"s"<<endl;cout<<endl;//归并tsum1=0;for(i=0;i<20;i++){for(j=0;j<n;j++){use[j]=save[i][j];//cout<<a[i]<<endl;}clock_t start, end;start = clock();MergeSort(use,0,n-1);end = clock();tsum1=tsum1+(double)(end - start) / CLOCKS_PER_SEC;if(i==0)cout<<"归并排序运行时间:";cout<<(double)(end - start) / CLOCKS_PER_SEC<<"s ";}cout<<endl;cout<<"平均时间为:"<<tsum1/20<<"s"<<endl;cout<<endl;//快速  tsum1=0;for(i=0;i<20;i++){for(j=0;j<n;j++){use[j]=save[i][j];//cout<<a[i]<<endl;}clock_t start, end;start = clock();quick(use,0,n-1);end = clock();tsum1=tsum1+(double)(end - start) / CLOCKS_PER_SEC;if(i==0)cout<<"快速排序运行时间:";cout<<(double)(end - start) / CLOCKS_PER_SEC<<"s ";}cout<<endl;cout<<"平均时间为:"<<tsum1/20<<"s"<<endl;cout<<endl;//插入tsum1=0;for(i=0;i<20;i++){for(j=0;j<n;j++){use[j]=save[i][j];//cout<<a[i]<<endl;}clock_t start, end;start = clock();insertSort(use,n);end = clock();tsum1=tsum1+(double)(end - start) / CLOCKS_PER_SEC;if(i==0)cout<<"插入排序运行时间:";cout<<(double)(end - start) / CLOCKS_PER_SEC<<"s ";}cout<<endl;cout<<"平均时间为:"<<tsum1/20<<"s"<<endl;cout<<endl;}return 0;}void display(int a[],int n){int i;for(i=0;i<n;i++)cout<<a[i]<<",";cout<<endl;}void selection (int a[],int n){int i,min,t,j;for(i=0;i<n-2;i++){t=a[i];//保存初始值min=i;//记录初始值下表for(j=i+1;j<n;j++)if(a[j]<a[min])min=j;//记录最小值下表        a[i]=a[min];a[min]=t;//交换}//display(a,n);}void bubble(int a[],int n){int i,j,t;for(i=0;i<n;i++)for(j=0;j<n-1-i;j++)if(a[j]>a[j+1]){//交换t=a[j];a[j]=a[j+1];a[j+1]=t;}//display(a,n);}void Merge(int a[],int low,int m,int high){ int i=low,j=m+1,p=0; int *temp=new int [high-low+1];//新空间放组合好的数组 while(i<=m && j<=high) {//依次挑选两个子表中较小的数字放在新建数组中 if(a[i]<=a[j]) { temp[p]=a[i]; p++; i++; } else if(a[i]>a[j]) { temp[p]=a[j]; p++; j++; } } //当有每一个子表有剩余的则全部移动到新建数组中 while(i<=m) temp[p++]=a[i++]; while(j<=high) temp[p++]=a[j++]; for(p=0,i=low;i<=high;i++) { a[i]=temp[p];//将数组中的数再覆盖回子表 p++; }}void MergeSort(int a[],int low,int high)  {         int mid;      if(low<high)      {   //区间长度大于1           mid=(low+high)/2;                       MergeSort(a,low,mid);           //递归地对a[low..mid]排序          MergeSort(a,mid+1,high);        //递归地对a[mid+1..high]排序          Merge(a,low,mid,high);          //组合,将两个有序区归并为一个有序区      } //if(low==0 && high==9)//display(a,high-low+1);}  int partition(int a[],int low,int high){int flag=a[low];int key=a[low];int t;while(low<high){while(low<high && a[high]>=key)//当比key大就减小下表--high;a[low]=a[high];//否则就交换while(low<high && a[low]<=key)//当比key小就增大下表++low;a[high]=a[low];//否则就交换}a[low]=flag;//把枢轴的位置确定return low;}void quick(int a[],int low,int high){if(low<high){int s=partition(a,low,high);//s得到枢轴的下标//分为两部分继续递归quick(a,low,s-1);quick(a,s+1,high);}//if(low==0 && high==9)//display(a,high-low+1);}void insertSort(int a[],int n){int  i, j, k,temp;for(i = 1; i < n; i++){temp = a[i];//取第一个无序的数字for(j = 0; j < i; j++)if (a[j] > temp)//找到第一个比temp大的值{for(k = i; k >= j; k--)a[k] = a[k-1];//讲目前的temp后面的值顺位移动,空出空位a[k] = temp;//将temp值插入空位。break;}}//display(a,n);}

可比较0~100000的数据排序

排序结果如下图



0 0
原创粉丝点击