快速排序与归并排序运行时间的比较,因为快排的时间复杂度为nlogn~n^2,而归并的时间复杂度固定为nlogn,所以理论上是归并比快排快,但是快排可以适用的范围更广,所以一般更推荐使用快排。
下面是相应实现的C++代码,可实现手工输入与随机生成20组随机数并进行时间比较。
#include<iostream> #include<ctime> #include<cmath> using namespace std; //merge function //使用一个数组作为容器存放合并后的数值然后返回给原数组 void merge(double array[],int low,int mid,int high){//合并函数 double *temp = new double[high-low+1]; int i=0,j=0,num=0; for(;i<=mid-low&&j<=high-mid-1;num++){ if(array[low+i]<array[mid+1+j]){ temp[num] = array[low+i]; i++; } else{ temp[num] = array[mid+1+j]; j++; } } if(j>high-mid-1){ for(;low+i<=mid;i++,num++) temp[num] = array[low+i]; }else{ for(;j+mid+1<=high;j++,num++) temp[num] = array[j+mid+1]; } for(int c=low;c<=high;c++){ array[c] = temp[c-low]; } } //mergesort void mergesort(double array[],int low,int high){ if(high>low){ int mid =(high+low)/2; mergesort(array,low,mid); mergesort(array,mid+1,high); merge(array,low,mid,high); } } //////////////////////////////////////////////////////////////////////////////////////////// //find_mid function //找出low、high、mid中中间大小的数与low位置的数交换作为分离值 void find_mid(double array[],int low,int high){ int mid=(low+high)/2,temp; if((array[low]<=array[high]&&array[low]>=array[mid])||(array[low]>=array[high]&&array[low]<=array[mid])){ temp = low; }else if((array[mid]<=array[low]&&array[mid]>=array[high])||(array[mid]>=array[low]&&array[mid]<=array[high])){ temp = mid; }else{ temp = high; } swap(array[low],array[temp]); } //split function //把数组分成大小两部分 void split(double array[],int &w,int low,int high){ find_mid(array,low,high); int i = low; double x = array[low]; for(int j= low+1;j<=high;j++){ if (array[j]<=x) { //1号标记处 i = i+1; if (i != j) { swap(array[i],array[j]); } } } swap(array[i],array[low]); w = i; } //quicksort function void quicksort(double array[],int low,int high){ int w; if (low < high) { split(array,w,low,high); quicksort(array,low,w-1);//此处可修改为quicksort(array,low,w), //但对应的1号标记处要改为array[j]<x,否则有相同数时会陷入死循环 quicksort(array,w+1,high); } } //////////////////////////////////////////////////////////////////////////////////////////// //main function void main(){ time_t beginMerge,endMerge,beginQuick,endQuick; int choose; cout<<"请输入你要排序的数组的数据来源,1为手工输入,2为随机生成"<<endl; cin>>choose; while(choose!=1&&choose!=2){ cout<<"输入有误,请重新输入,1为手工输入,2为随机生成"<<endl; cin>>choose; } switch(choose){ case 1:{ int num; cout<<"请输入需要排序的数值个数"<<endl; cin>>num; double *array =new double[num]; cout<<"请输入要排序的数值,范围在0~10^5之间"<<endl; for(int i=0;i<num;i++){ cin>>array[i]; } beginMerge=clock(); mergesort(array,0,num-1); endMerge=clock(); beginQuick=clock(); quicksort(array,0,num-1); endQuick=clock(); cout<<"归并排序所用时间: "<<static_cast<double>(endMerge-beginMerge)/CLOCKS_PER_SEC*1000<<"毫秒 快速排序所用时间:"//因为是求毫秒所以乘上1000 <<static_cast<double>(endQuick-beginQuick)/CLOCKS_PER_SEC*1000<<"毫秒"<<endl; break;} case 2:{ for(int v=1;v<=20;v++){ double* array = new double[v*5000]; for(int j=0;j<v*5000;j++){ array[j]=(int)rand()/pow(10,5); } beginMerge=clock(); mergesort(array,0,v*5000-1); endMerge=clock(); beginQuick=clock(); quicksort(array,0,v*5000-1); endQuick=clock(); cout<<"第"<<v<<"组归并排序所用时间: "<<static_cast<double>(endMerge-beginMerge)/CLOCKS_PER_SEC*1000<<"毫秒 快速排序所用时间:" <<static_cast<double>(endQuick-beginQuick)/CLOCKS_PER_SEC*1000<<"毫秒"<<endl; } break;} } }其中可以添加<cmath>头文件使用pow(a,b)函数求出a的b次方的值,然后可以添加<ctime>头文件在排序函数的前后调用clock()函数返回系统当前时间,两次相减得到排序函数运行时间。