各类排序算法比较(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;
	}
}




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