插入排序
關鍵字:排序
插入法穩定
使用範圍:小規模資料的排序的最佳方案,而且是一種穩定的排序。
演算法複雜度:o(
n2)
思想:
首先我們來想乙個問題,我們是否能找到一種方法,使乙個數插入到乙個有序的陣列當中,並保證它依然有序呢?
那麼,我們又如何將一組無序的數插入到乙個有序的陣列之中,並且保證它依然有序呢?
至此,聰明的讀者就會發現,解決了這兩個問題,我們就知道如何排序了。
下面我們來詳細的講解一下查入排序的思想:
首先我們將一組無序的數分為兩組,一組有序的,記作
a,一組無序的,記作
b。開始的時候
a中只有乙個元素,顯然只有乙個元素的陣列是有序的,我們開始將
b中的元素逐個插入到
a中,並且每一次插入都保證
a是有序的,一直將
b中的元素全部插入到
a中,那麼我們就將這個陣列排好序了。
下面我們來看一下如何將乙個數插入到乙個有序陣列中,有乙個陣列
和乙個數
6,我們可以從陣列的前面開始查詢直到找到乙個不小於
6的數,然後把
6放在他前面。我們也可以從陣列的後面開始查詢直到找到乙個不大於
6的數,然後把
6放到他的後面。或者我們可以用二分查詢到
6應該在陣列中的位置然後把
6放在那。在這個查詢位置的過程中,基於比較的複雜度依次是o(
n)、o(
n)、o(
log2n)。
那麼,將乙個陣列排序的過程,就是將有序陣列不斷增大的過程,從開始只有乙個元素,到後來整個陣列都是有序的,那麼,每插入一次的時間複雜度與有序陣列的大小有關,假設目前的有序陣列大小為
i,此次插入的最壞比較次數為
i,那麼,最壞情況下,也就是陣列倒序時,總體的比較次數為
1+2+3+…+(n-1)=n(n-1)/2
最好情況下,也就是陣列有序時,這時的比較次數為
n-1次。
平均情況下,一次插入的比較次數為
i/2,總體的比較次數為
1/2+2/2+3/2+…+(n-1)/2=n(n-1)/4
所以,平均情況下比較複雜度為
o(n2
),如果我們考慮每次插入,在查詢位置時使用二分查詢,平均情況下比較複雜度為o(
nlog2n
)。 細心的讀者會發現,插入排序的時間複雜度不是o(
n2)嗎?怎麼變成o(
nlog2n
)了?其實,在排序的過程中,除了比較的花銷之外,還有元素移動的花銷。
如果用陣列來實現,每次移動的花銷是o(
n),總體的花銷是
o(n2)。
如果用鍊錶來實現,每次移動的花銷是o(
1),但查詢時就不能用二分法,所以總體的花銷還是
o(n2)。
下面給出乙個用陣列為資料結構的插入排序的
c++**:
/** *
插入排序方法
* @param array
陣列名
* @param left
排序的起始位置
* @param length
陣列要排序的長度
* @author oracleot & iceer */
void insertsort(int * array, int left, int length)
array[j+1] = current ; }
}
回顧排序演算法之插入排序
插入排序顧明思議就是將目標數插入到已有的有序列表數列中,可能我們本能的會認為是外部資料插入到已有的資料列表中,但是插入排序是可以進行數列內部排序的。核心思想就是將數列裡面的字序列當做已排序的有序數列,然後對後面的資料進行比較移動插入操作。例項 int arr 第一輪把單獨當做已經排列好的序列把後面的...
演算法之插入排序
直接插入排序 package insertsort 插入排序之直接插入排序 直接插入排序基本思想 在要排序的一組數中,假設n 1個數已經排好,將第n個數插入到已經排好的序列中 如此反覆迴圈,直至所有的數排好。public class directinsertsort public int inser...
排序演算法之插入排序
排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...