快速排序与归并排序时间对比

快速排序与归并排序运行时间的比较,因为快排的时间复杂度为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()函数返回系统当前时间,两次相减得到排序函数运行时间。

你可能感兴趣的:(归并排序,快速排序,归并与快排时间比较)