插入排序(insertion sort) 是一種簡單直觀的排序演算法。
插入排序的靈感可能來自於我們玩牌的經驗。當我們摸牌的時候,每摸到一張牌,都會將這張牌插入到其他有序的牌中的適當位置。
排序演算法(預設是公升序)的原理是,計算機在遍歷陣列中的元素時,認為當前索引左邊的元素都是有序的,首先在左邊有序的陣列中從後往前找出當前陣列應該插入的位置,然後依次挪動左邊有序元素,給要插入的元素騰出位置,最後將該元素插入到騰空的位置。迴圈往復,直到陣列完成排序。
對於長度為 n
nn 的陣列,選擇排序需要大約 n2/
2n^2/2
n2/2
次比較和 n2/
2n^2/2
n2/2
次交換。
用 swift 實現的插入排序**如下所示:
實現一 : 找出插入位置,然後移動元素,最後插入元素
/// 插入排序 先挪位置,然後插入
func
insertionsort
(unsortedarray:
inout
[int])
for i in1.
.< unsortedarray.
count
if formerindex != i -1}
}
實現二:使用元素交換來插入元素/// 插入排序 使用交換來代替挪位置
func
insertionsort1
(unsortedarray:
inout
[int])
for i in1.
.< unsortedarray.
count
formerindex -=1
}}}
var list =[2
,3,5
,7,4
,8,6
,10,1
,9]// 將會列印 [2, 3, 5, 7, 4, 8, 6 ,10 ,1, 9]
print
(list)
// 用演算法一進行插入排序
insertionsort
(unsortedarray:
&list)
// 將會列印 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print
(list)
// 恢復陣列排序,用演算法二排序
list =[2
,3,5
,7,4
,8,6
,10,1
,9]insertionsort1
(unsortedarray:
&list)
// 將會列印 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print
(list)
穩定性
:是穩定演算法,因為排序過程中相鄰會依次比較,不會打亂相同元素的相對位置。
空間複雜度
:整個排序過程是在原陣列上進行排序的,所以是 o(1
11)。
時間複雜度
:排序演算法包含雙層巢狀迴圈,故為 o(n
2n^2
n2)。插入排序適合於部分有序的陣列。
插入排序 php版本
function insertsort array container return container print r insertsort 3,12,42,1,24,5,346,7 列印出i 3時輸出的 container array 0 3 1 12 2 1 3 42 4 24 5 5 6 3...
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...