分別使用插入排序、合併排序、快排對隨機生成的若干整數序列進行排序,並統計各種情況下排序所耗費的時間。

分別使用插入排序、合併排序、快排對隨機生成的若干整數序列進行排序,並統計各種情況下排序所耗費的時間。

#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;
}

排序執行的時間太短,程序幾乎捕捉不到時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章