演算法回顧之插入排序

2021-04-22 07:09:27 字數 1741 閱讀 8589

插入排序

關鍵字:排序

插入法穩定

使用範圍:小規模資料的排序的最佳方案,而且是一種穩定的排序。

演算法複雜度: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 後時,...