各類排序算法比較(C++)

1、簡單選擇排序

基本思想:在序列A[0]~A[n-1]中,第i趟(i=0;i>n;i++)選擇從A[i-1]~A[n-1]中最小的數和A[i-1]交換,直至i=n-1,結束排序。

時間複雜度:最好情況   O(n^2)

                   最壞情況   O(n^2)

                   平均情況   O(n^2)

template<class T>
void SelectSort(T A[], int n)
{
	int small;
	for (int i=0;i<n-1;i++)
	{
		small=i;
    	for (int j=i+1;j<n;j++)
			if (A[j]<A[small])
				small=j;
		swap(A[i],A[small]);
	}
}

2、直接插入排序

基本思想:將序列中第一個作爲有序數列,剩下n-1個元素按關鍵字大小一次插入該有序序列,經過n-1趟完成排序。

時間複雜度:最好情況   O(n)

                     最壞情況   O(n^2)

                    平均情況   O(n^2)

template<class T>
void InsertSort(T A[],int n)
{
	for (int i=1;i<n;i++)
	{
		int j=i;
		T temp=A[i];
		while(j>0&&temp<A[j-1])
		{
			A[j]=A[j-1];
			j--;
		}
		A[j]=temp;
	}
}

3、冒泡排序

基本思想:第一趟在序列(A[0]~A[n-1])中從前往後進行兩個相鄰元素的比較,若後者小,則交換,比較n-1次。第一趟結束,最大元素則位於序列末端,接下來只需要比較(A[1]~A[n-2]),依此類推。

時間複雜度:最好情況   O(n)

                     最壞情況   O(n^2)

                     平均情況   O(n^2)


template<class T>
void BubbleSort(T A[], int n)
{
	int i,j,last;
	i=n-1;
	while(i>0)
	{
		last=0;
		for (j=0;j<i;j++)
		{
			if (A[j+1]<A[j])
			{
				swap(A[j],A[j+1]);
				last=j;
			}
		}
		i=last;
	}
}


4、快速排序

基本思想:快速排序(Quicksort)是對冒泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

時間複雜度:最好情況  O(log2(n))

                     最壞情況   O(n^2)

                     平均情況  O(log2(n))

template<class T>
void QuickSort(T A[],int n)
{
	QSort(A,0,n-1);
}
template<class T>
void QSort(T A[],int left,int right)
{
	int i,j;
	if(left<right)
	{
		i=left;
		j=right+1;
		do 
		{
			do i++;while (A[i]<A[left]);
			do j--;while (A[j]>A[left]);
			if (i<j) swap(A[i],A[j]);
		} while (i<j);
		swap(A[left],A[j]);
		QSort(A,left,j-1);
		QSort(A,j+1,right);
	}
}


5、兩路合併排序

基本思想:

它的基本思想就是假設數組A有N個元素,那麼可以看成數組A是又N個有序的子序列組成,每個子序列的長度爲1,然後再兩兩合併,得到了一個  N/2   個長度爲2或1的有序子序列,再兩兩合併,如此重複,值得得到一個長度爲N的有序數據序列爲止
時間複雜度:最好情況  O(log2(n))

                     最壞情況   O(log2(n))

                     平均情況  O(log2(n))

template<class T>
void Merge(T A[],int i1,int j1,int i2,int j2)
{
	T *temp=new T[j2-i1+1];
	int i=i1,j=i2,k=0;
	while (i<=j1 && j<=j2)
		if (A[i]<=A[j])
			temp[k++]=A[i++];
		else temp[k++]=A[j++];
		while (i<=j1) temp[k++]=A[i++];
		while (j<=j2) temp[k++]=A[j++];
		for (i=0; i<k; i++) A[i1++]=temp[i];
		delete []temp;
}
template<class T>
void MergeSort(T A[], int n)
{
	int i1,j1,i2,j2;
	int size=1;
	while (size<n)
	{
		i1=0;
		while (i1+size<n){
			i2=i1+size;
			j1=i2-1;
			if (i2+size-1>n-1)
				j2=n-1;
			else j2=i2+size-1;
			Merge(A,i1,j1,i2,j2);
			i1=j2+1;
		}
		size*=2;
	}
}




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