您的位置:首页 > 其它

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

2013-11-07 17:25 302 查看
快速排序与归并排序运行时间的比较,因为快排的时间复杂度为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()函数返回系统当前时间,两次相减得到排序函数运行时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息