分別使用插入排序、合併排序、快排對隨機生成的若干整數序列進行排序,並統計各種情況下排序所耗費的時間。
#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;
}
排序執行的時間太短,程序幾乎捕捉不到時間。