各类排序算法比较(C++)

原创 2012年03月24日 20:01:24

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




关于C++各类排序算法与std::sort性能的比较

talk is cheap.直接放代码(C++)。 先定义一个计时的类。 class Time_count//时间计时类,需要#include { private: clock_t ...

各类排序算法的c++实现

#ifndef SORT_H #define SORT_H #include #include using namespace std; // 1.直接插入排序 template void Ins...

各类排序算法的比较总结

排序算法是最基本最常用的算法,不同的排序算法在不同的场景或应用中会有不同的表现,我们需要对各种排序算法熟练才能将它们应用到实际当中,才能更好地发挥它们的优势。今天,来总结下各种排序算法。下面这个表格总...

各类排序算法比较和应用场景

简介插入排序插入排序是一种较为简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 形象的可以理解为打扑克抓拍的过程,通常我们右手抓牌,...
  • MBuger
  • MBuger
  • 2017年03月28日 21:47
  • 2475

南邮数据结构实验4 各类排序算法实现与比较

//VC6.0下编译 #include #include #include template void Swap(T &a,T &b) { T temp=a; a=b; b=temp; } t...

c++实现比较各种排序算法的效率

  • 2012年06月15日 12:39
  • 21KB
  • 下载

多个排序算法的比较————C++

  • 2009年09月03日 12:22
  • 874KB
  • 下载

常见排序算法(零)(各类排序算法总结与比较)

八种排序算法(冒泡排序(BubbleSort)、选择排序(Selection Sort)、插入排序(Insertion Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)、...

c++内部排序算法比较

  • 2010年12月22日 21:20
  • 282KB
  • 下载

各类排序算法java的实现

  • 2008年10月20日 22:03
  • 11KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:各类排序算法比较(C++)
举报原因:
原因补充:

(最多只允许输入30个字)