插入排序時一種常見的排序算法,有點類似于我們打撲克摸牌的過程,每摸一張牌,我們便通過對比手上已有的牌,將剛拿到的牌放入合適的位置。
實現實現思路
假設前j-1個元素已經排好序, 將第j個元素分別于其前面元素[i]比較,
- 如i元素較大,則將i元素的值往前移動一位,即 a[i+1] = a[i]
- 若i元素較小,則直接將j位置的值放到 i+1元素的位置。
下面以[1, 5, 3, 4, 5, 6, 8]這個待排序數組為例,以圖解的方式來講解一下插入排序的具體過程。
從j等于1開始(這里假設初始位置為0),如下圖所示
此時拿著5和前面的每個數對比,此處是1,發現 5 > 1,故將五放在 i+1的位置,即5的位置保持不變,此時i = 0, 即前面已經沒有其他數了了,所以前兩個數已經排好序。
接著 j = j+ 1,如下圖所示。 i = j-1
為了能將3排好序,必須將其與其前面(位置0,1)的數逐個對比,這里先對比 3和5,發現 3< 5,此時 將5放到3的位置,
此時i =0, 對比i位置的值和key的大小,發現 1 < 3,此時找到key應該放置的位置,即 i + 1 =3;
此時前三個數已經排好序,j 繼續加1
此時,要將 key =4 插入到前面( 0 -3)的合適位置中去,同樣對比 key和 i位置的值,發現 5 > 4,大的應該往后推,所以 5應該在4的后面。
這里將5往前移動一位, i –,在比較 i位置的值和 key的大小關系
發現 3 < key,0 -i都已排好序,所以找到了key的合適位置,即是 i+ 1;
j繼續加1,重復上述過程,直至 j = 6,最后便可以排成
1,3, 4,5, 5,6, 8
簡而言之,每次排序一個數key,都要對比前面的對比該位置的值與該位置前面的值的大小,若key較小,則將與key對比的數往后( i+1)移動一位。直到找到一個小于或等于key的值,則將key放在該數的后一個位置處。
根據上面的過程,我們可以很容易的得到該排序過程的時間復雜度,因為要排序每一個數(n),排序該數的時候,還得將這個數與前面最多(n-1)個數對比,才能找到合適的位置。所以其時間復雜度約為0(n2)。
js代碼實現
總結
1)從第二位開始,與前面的所有數值比較,將大的數據向下移動
2)時間復雜度是O(n2)