原理解析
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
问题描述:
把数组 [61,5,33,44,22] 进行从小到大进行排序
第一种:插入排序通过移动
解题步骤:
/*
步骤如下:
* 从第一个元素开始,该元素可以认为已经被排序
* 取出下一个元素,在已经排序的元素序列中从后向前扫描
* 如果该元素(已排序)大于新元素,将该元素移到下一位置
* 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
* 将新元素插入到该位置后
* 重复步骤2~5
*/
## 代码:
func p_insertSortMobile(array: inout [Int]) -> [Int] {
guard array.count > 1 else {
return array
}
for i in 0..<(array.count - 1) {
if array[i + 1] < array[i] {//小于有序区最大的数值,需要插入有序系列
let temp = array[i + 1] //保存将要被有序区向后移顶替的值(即本轮插进有序区的值)
var j = i + 1//有序区的序号
repeat { //数据移动比 temp 大的都往后移
j -= 1
array[j + 1] = array[j]
} while (j - 1 >= 0) && (array[j - 1] > temp) // 还需要移动
// 插入
array[j] = temp
}
}
return array
}
测试:
@objc func insertSortMobile() {//插入排序 通过移动
var list = [61,5,33,44,22]
let result = p_insertSort(array: &list)
print(result)
}
结果
[5, 22, 33, 44, 61]
第一种:插入排序通过交换
代码:
func p_insertSortExchange(array: inout [Int]) -> [Int] {
guard array.count > 1 else {
return array
}
for i in 1..<array.count {
var y = i //从 i 往前栈。符合条件交换
while y > 0 && array[y] < array [y - 1] {
let temp = array[y]
array[y] = array[y - 1]
array[y - 1] = temp
y -= 1
}
}
return array
}
测试:
@objc func insertSortExchange() {//插入排序,通过交换
var list = [61,5,33,44,22]
let result = p_insertSortExchange(array: &list)
print(result)
}
结果:
[5, 22, 33, 44, 61]