將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料
插入排序分為兩種:直接插入排序和希爾排序
插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。
最好的情況下
:正序有序
(從小到大),這樣只需要比較n次,不需要移動。因此時間複雜度為o(n)
最壞的情況下
:逆序有序
,這樣每乙個元素就需要比較n次,共有n個元素,因此實際複雜度為o(n
2)
平均情況下
:o(n2)
在排序過程中僅需要乙個元素的輔助空間,所以空間複雜度為為o(1)。
穩定性
直接插入排序是在乙個已經有序的小序列的基礎上,一次插入乙個元素。當然,剛開始這個有序的小序列只有1個元素,就是第乙個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其後面,否則一直往前找直到找到它該插入的位置。如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以直接插入排序是穩定的。
因而,直接插入排序不適合對於資料量比較大的排序應用。但是,如果需要排序的資料量很小,例如,量級小於千,那麼直接插入排序還是乙個不錯的選擇。
希爾排序是按照不同步長對元素進行插入排序,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快;當元素基本有序了,步長很小, 插入排序對於有序的序列效率很高。
由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以希爾排序是不穩定的。
希爾排序是基於插入排序的一種演算法, 在此演算法基礎之上增加了乙個新的特性,提高了效率。對中等大小規模表現良好,對規模非常大的資料排序不是最優選擇。並且希爾排序非常容易實現,演算法**短而簡單。
演算法與資料結構 插入排序
例如 給定乙個無序陣列int arr n代表集合陣列的長度,給出乙個演算法將陣列arr按照從小到大的順序進行排列。插入排序 看當前位置i的值是否比它前乙個數小,如果小就與前面的數交換位置。public static void insertionsort int arr,int n public st...
資料結構與演算法 插入排序
一 排序的相關概念 1 排序 將任意序列的資料元素,重新排列成按關鍵字有序 遞增有序或遞減有序 的序列過程。2 穩定性 若在排序過程中,序列的兩個關鍵字值相同的記錄,在排序結束後,相對位置不發生改變,則稱所用的排序方法為穩定的。3 排序方法的兩個效能指標 時間複雜度和空間複雜度。二 插入排序 1 基...
資料結構與演算法 插入排序
基本思想 每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,直到元素全部插完為止。1.元素集合越接近有序,直接插入排序演算法的時間效率越高 2.時間複雜度 最優情況下 o n 最差情況下 o n 2 3.空間複雜度 o 1 它是一種穩定的排序演算法 4.穩定性...