理解:
从前向后遍历数组,得到的每个数据依次向前移动, 并与已排序数据俩俩依次比较,并选择合适的位置插入
代码:
function insertionSort(arr) {
// 特殊数据处理
if (arr == null || arr.length < 2) {
return
}
// 外层循环 待排序区域
// 待排序数据依次进入到已排序区域
for (let i = 1; i < arr.length; i++) {
// 内层循环 已排序区域
// 待排序数据从后向前依次选择合适的位置插入
// 俩俩比较有点类似向前冒泡
for(let j = i; j > 0; j--){
// 前一个数据大于自己时即交换
// 前一个数据小于或等于自己时则不交换 并退出循环
// 这样可保持稳定性
if (arr[j - 1] > arr[j]) {
swap(arr, j - 1, j)
}else{
break
}
}
}
function swap(arr, i, j) {
let tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
// 直接在原数组进行修改 可以没有返回值
}
性能:
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 稳定性:可以保持,遇到相等值的元素不进行交换,直接跳过即可保持稳定性