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