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