insertion_sort
insertion_sort_example
- 分类:排序算法
- 数据结构:数组
- 最坏时间复杂度:
O(n^2)
- 最优时间复杂度:
O(n)
- 平均时间复杂度:
O(n^2)
- 空间复杂度:总共
O(n)
,需要辅助空间O(1)
插入排序(英文:Insertion Sort),是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序 在实现上,通常采用in-place
排序(即只需用到O(1)
的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
如果 比较操作 的代价比 交换操作 大的话,可以采用 二分查找法(该算法可以认为是 插入排序 的一个变种,称为 二分查找插入排序)来减少 比较操作 的数目
维基百科
Swift
static func insertionSort(array: inout Array<Int>) {
for i in 0..<array.count {
var j = i
let tmp = array[i]
while j > 0 && tmp < array[j-1] {
print("while - old - i --- \(i) --- j --- \(j) ---> \(array)")
array[j] = array[j-1]
j -= 1
print("while - new - i --- \(i) --- j --- \(j) ---> \(array)")
}
array[j] = tmp
print(" i final --- \(i) ---> \(array)")
}
}
排序过程:
原 ---> [10, 120, 13, 5, 80, 40, 90]
i final --- 0 ---> [10, 120, 13, 5, 80, 40, 90]
i final --- 1 ---> [10, 120, 13, 5, 80, 40, 90]
while - old - i --- 2 --- j --- 2 ---> [10, 120, 13, 5, 80, 40, 90]
while - new - i --- 2 --- j --- 1 ---> [10, 120, 120, 5, 80, 40, 90]
i final --- 2 ---> [10, 13, 120, 5, 80, 40, 90]
while - old - i --- 3 --- j --- 3 ---> [10, 13, 120, 5, 80, 40, 90]
while - new - i --- 3 --- j --- 2 ---> [10, 13, 120, 120, 80, 40, 90]
while - old - i --- 3 --- j --- 2 ---> [10, 13, 120, 120, 80, 40, 90]
while - new - i --- 3 --- j --- 1 ---> [10, 13, 13, 120, 80, 40, 90]
while - old - i --- 3 --- j --- 1 ---> [10, 13, 13, 120, 80, 40, 90]
while - new - i --- 3 --- j --- 0 ---> [10, 10, 13, 120, 80, 40, 90]
i final --- 3 ---> [5, 10, 13, 120, 80, 40, 90]
while - old - i --- 4 --- j --- 4 ---> [5, 10, 13, 120, 80, 40, 90]
while - new - i --- 4 --- j --- 3 ---> [5, 10, 13, 120, 120, 40, 90]
i final --- 4 ---> [5, 10, 13, 80, 120, 40, 90]
while - old - i --- 5 --- j --- 5 ---> [5, 10, 13, 80, 120, 40, 90]
while - new - i --- 5 --- j --- 4 ---> [5, 10, 13, 80, 120, 120, 90]
while - old - i --- 5 --- j --- 4 ---> [5, 10, 13, 80, 120, 120, 90]
while - new - i --- 5 --- j --- 3 ---> [5, 10, 13, 80, 80, 120, 90]
i final --- 5 ---> [5, 10, 13, 40, 80, 120, 90]
while - old - i --- 6 --- j --- 6 ---> [5, 10, 13, 40, 80, 120, 90]
while - new - i --- 6 --- j --- 5 ---> [5, 10, 13, 40, 80, 120, 120]
i final --- 6 ---> [5, 10, 13, 40, 80, 90, 120]
[5, 10, 13, 40, 80, 90, 120]
不定期更新 不合适的地方 还请指点~ 感激不尽