插入排序詳解

插入排序是一種較常用的排序手段。這個算法的實現過程特別簡單,我們舉個例子就知道了。

比如一羣身高不等的人站成一排,現在要求按照從矮到高次序排序。那麼插入排序是這樣做的:

從第二個人開始,依次往前走,直到前面的比自己矮位置,然後站在第一個比自己矮的人後面。有人會說萬一前面還有比自己高的呢?注意,我們這裏是從第二個開始的,也就是假設的每個人前面都是排好序的。

如果你還沒有明白的話,我剛剛整好在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循環,有興趣的同學可以試一下。

發佈了65 篇原創文章 · 獲贊 75 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章