插入排序是一種較常用的排序手段。這個算法的實現過程特別簡單,我們舉個例子就知道了。
比如一羣身高不等的人站成一排,現在要求按照從矮到高次序排序。那麼插入排序是這樣做的:
從第二個人開始,依次往前走,直到前面的比自己矮位置,然後站在第一個比自己矮的人後面。有人會說萬一前面還有比自己高的呢?注意,我們這裏是從第二個開始的,也就是假設的每個人前面都是排好序的。
如果你還沒有明白的話,我剛剛整好在bing上面搜到一個相應的圖片來說明(真的很巧,居然有人和我舉一樣的例子,我發誓身高排序的例子是我瞎編的)
結合上面的圖,你有沒有理解呢?如果沒有理解也沒關係,下面再結合我的代碼來看一下:
/*
* insertSort.cpp
*
* Created on: Dec 3, 2015
* Author: freestyle4568
*/
#include <iostream>
#include <vector>
using namespace std;
void insertSort(vector<int> &A)
{
int length = A.size();
for (int j = 1; j < length; j++) {
int key = A[j];
int i = j - 1;
<pre name="code" class="cpp"> while (i >= 0 && A[i] > key) {
A[i+1] = A[i];
i--;
}
A[i+1] = key;
}
}
void print(vector<int> &A)
{
for (size_t i = 0; i < A.size(); i++)
cout << A[i] << endl;
}
int main()
{
size_t n = 0;
cout << "input the numbers of array: ";
cin >> n;
vector<int> A(n, 0);
for (size_t i = 0; i < n; i++)
cin >> A[i];
//print(A);
insertSort(A);
print(A);
return 0;
}
insertSort函數中就是一個完整的插排代碼,是不是很短啊
注意:這裏的插排是穩定排序。什麼是穩定排序呢?就是相等的量在排完序以後前後順序沒有變!我們上面的insertSort函數中,有一個:
<span style="font-size:18px;">while (i >= 0 && A[i] > key)</span>
其中的A[i] > key就是決定是否穩定的。這裏是只有前面的比自己大才繼續,如果相等就排在後面,所以穩定。
如果A[i]>=key的話,那就不穩定了,這樣所以相等值的前後順序會顛倒過來。
插入排序的複雜度爲O(n^2);
詳細的推倒過程在算法導論上面,感興趣的同學可以去看一下。
其實我們也能從有個嵌套循環大概看出來爲n^2。不過這樣不太準確,有的時候甚至會出錯,有可能是nlogn。
下面簡單看一下算法導論的課後題目:
第一題是運行結果:
第二題是要我們重寫insertSort函數實現降序排序:
把A[i] > key中改成A[i] < key就可以了。
第三題是一個證明題,沒什麼意思,直接pass。
第四題是n位二進制整數加,其實也是個for循環,有興趣的同學可以試一下。