(1)插入排序
分析: 插入排序就是通過數字插入有序數組的方式進行排序的, 代碼簡單, 且易理解。時間複雜度O(N*N)
代碼如下:
template <typename T>
void InsertSort(vector<T>& array)
{
for(int i=0; i<array.size(); ++ i)
{
for(int j=i; j>0; -- j)
{
if(array[j] < array[j-1])
swap(array[j], array[j-1]);
else
break;
}
}
}
(2)冒泡排序
分析:冒泡排序多次遍歷數組,每次遍歷將當前位置與後面位置的數進行比較,大的放後面, 這樣每次遍歷最後一位數字必爲整個數組中最大的元素, 經過n-1次遍歷後,整個數組有序。時間複雜度O(N*N)
代碼如下:
template <typename T>
void BubbleSort(vector<T>& array)
{
for(int i=array.size()-1; i>0; -- i)
{
for(int j=0; j<i; ++ j)
{
if(array[j] > array[j+1])
swap(array[j], array[j+1]);
}
}
}
(3)歸併排序
分析:兩個有序數組的合併,應該都很熟悉。現在將一個數組N個元素,將它看做N個數組, 每個數組一個元素,這樣任意一個數組都是有序的,然後兩兩合併(有序數組的合併),會得到N/2個有序數組,然後在兩兩合併… ,直到數組數量爲1, 即爲歸併排序。時間複雜度O(N*log(N))
代碼如下:
template <typename T>
void Merge(vector<T> &array, vector<T> &res, int b, int e)
{
if(b < e)
{
int mid = (b + e) >> 1;
Merge(array, res, b, mid);
Merge(array, res, mid+1, e);
int i = b, j = mid + 1;
int k = b;
while(i <= mid && j <= e)
{
if(array[i] < array[j])
res[k ++] = array[i ++];
else
res[k ++] = array[j ++];
}
while(i <= mid)
res[k ++] = array[i ++];
while(j <= e)
res[k ++] = array[j ++];
for( ; b <= e; ++ b)
array[b] = res[b];
}
}
template <typename T>
void MergeSort(vector<T> &array)
{
vector<int> tmp(array.size());
Merge(array, tmp, 0, array.size()-1);
}
(4)快速排序
分析:最常用的算法就是快速排序,既然常用就有必要知道它的排序原理了。
首先從數組中選擇一個數字X(最好是數組中的中位數,原因往下看),然後用首尾指針將大於X的放在數組的右邊,小於X的放在數組左邊,這樣在X的左邊的數字全部爲小於X的數字,在X右邊的數字全部爲大於X的數字。對於數字X,它的位置已經確定;然後將X左邊和X右邊依次遞歸進行這樣的過程,最後得到的數字即爲有序。
選取數組中的中位數(實際上採用三數中值分割的方法),會將遞歸的層數減少(每次少一半,),使複雜度趨近Nlog(N);
如果每次選取的數字爲待排序部分中,最小或最大的,會加大遞歸層數(每次少1), 複雜度趨近 NN
代碼如下:
//從首尾中,三個數字中,選取中間的數字作爲數字X
template <typename T>
T getMid(int b, int e, vector<T> &array)
{
int mid = (b + e) >> 1;
if(array[b] > array[mid])
swap(array[b], array[mid]);
if(array[b] > array[e])
swap(array[b], array[e]);
if(array[mid] > array[e])
swap(array[mid], array[e]);
swap(array[mid], array[e]);
return array[e];
}
template <typename T>
void InsertSort(vector<T> &array, int b, int e)
{
for(int i=b; i<e; ++ i)
{
for(int j = i; j > b; -- j)
{
if(array[j] < array[j-1])
swap(array[j], array[j-1]);
else
break;
}
}
}
template <typename T>
void Qsort(vector<T> &array, int b, int e)
{
if(b + 3 > e)
{
T mid = getMid(b ,e, array);
int i = b, j = e;
for(;;)
{
while(array[++ i] <= mid);
while(array[-- j] > mid);
if(i < j)
swap(array[i], array[j]);
else
break;
}
swap(array[i], array[e]);
Qsort(array, b, i-1);
Qsort(array, i+1, e);
}
else
InsertSort(array, b, e);
}
template <typename T>
void QuickSort(vector<T> &array)
{
Qsort(array, 0, array.size()-1);
}