分别使用插入排序、合并排序、快排对随机生成的若干整数序列进行排序,并统计各种情况下排序所耗费的时间。

分别使用插入排序、合并排序、快排对随机生成的若干整数序列进行排序,并统计各种情况下排序所耗费的时间。

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

排序执行的时间太短,程序几乎捕捉不到时间。

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