分别使用插入排序、合并排序、快排对随机生成的若干整数序列进行排序,并统计各种情况下排序所耗费的时间。
#include<iostream>
using namespace std;
#include<ctime> //time()函数
#include<cstdlib>//srand()和rand()函数在此文件中
clock_t start,stop;//clock_t为clock()函数返回的变量类型
double duration;
/*
插入排序
*/
void insertSort(int a[],int n){
int t,j;
for(int i=1;i<n;i++){
t=a[i];
for(j=i-1;t<a[j]&&j>=0;j--)
a[j+1]=a[j];
a[j+1]=t;
}
}
/*
归并排序
*/
//将数组a中已经排好序的l到m和m+1到r合并成一个升序数组
void merge(int a[],int l,int m,int r){
int x=m-l+1,y=r-m;
int *A=new int[x];
int *B=new int[y];
//将数组a中下标l到m的元素复制到数组A
for(int i=0,j=l;j<=m;i++,j++)
A[i]=a[j];
//将数组a中下标m+1到r的元素复制到数组B
for(int i=0,j=m+1;j<=r;i++,j++)
B[i]=a[j];
int i=0,j=0,k=l;
while(i<x&&j<y){
if(A[i]<=B[j])
a[k++]=A[i++];
else
a[k++]=B[j++];
}
if(i>=x) //将数组B中未排序的数据加到数组a中
while(j<y) a[k++]=B[j++];
else //将数组A中未排序的数据加到数组a中
while(i<x) a[k++]=A[i++];
}
//二分归并排序
void merge_sort(int a[],int l,int r){
if(l<r){
int m=(l+r)/2;//对半划分
merge_sort(a,l,m);//左边排序
merge_sort(a,m+1,r);//右边排序
merge(a,l,m,r);//合并
}
}
/*
快排
*/
int partition(int a[], int p, int r){
int x = a[r];
int i = p - 1;
for (int j = p; j < r; j++){
if (a[j] < x){
i++;
swap(a[i], a[j]);
}
}
swap(a[i + 1], a[r]);
return i + 1;
}
void quicksort(int a[], int p, int r){
if (p < r){
int q = partition(a, p, r);
quicksort(a, p, q - 1);
quicksort(a, q + 1, r);
}
}
/*
测试
*/
int main(){
srand((unsigned)time(NULL));
int a[1005];
for(int i=0;i<1000;i++)
a[i]=rand();
cout<<"before sort:"<<endl;
for(int i=0;i<1000;i++){
cout<<a[i]<<" ";
}
cout<<endl;
start=clock(); //单位为ms
// insertSort(a,1000);
// merge_sort(a,0,999);
quicksort(a,0,999);
stop=clock();
cout<<"after sort:"<<endl;
for(int i=0;i<1000;i++){
cout<<a[i]<<" ";
}
cout<<endl;
//duration=(double)(stop-start)/CLK_TCK; //CLK_TCK为clock()函数的时间单位,即时钟打点
duration=difftime(stop,start);//difftime(time_t, time_t)返回两个time_t变量间的时间间隔,即时间差
cout<<duration<<endl;
return 0;
}
排序执行的时间太短,程序几乎捕捉不到时间。