原理
取出一个值并插入到一个已有序的数组,插入后的数组依然保持有序
思路讲解
1、使用循环,将目标数组中的值依次取出,与有序数组中的值做比较
2、将当前取出的值,放到有序数组中的指定位置,使有序数组依然保持有序
3、最后循环完之后,将有序数组返回,即为结果
多种实现方式
这里我们将给出几个不同的实现方式,基本思想是一致的,只是实现的代码有所不同罢了
方案1
//方案一最简单,最容易理解,比较直观,也是笔者第一次按照原理写出来的方法
function insertSort (arr) {
/**
* 新建两个数组,
* tempArr做数据变更
* sortArr用来存储有序数组
*/
let tempArr = []
let sortArr = []
/**
* 进行循环遍历
* 将满足条件的元素不断向 sortArr 中添加
*/
for(let i = 0; i < arr.length; i++) {
// mark 用于判断有序数组中是否有比目标值大的值,如果没有,则直接放到末尾
let mark = false
// 每次循环,将改变的值赋值给有序数组
sortArr = JSON.parse(JSON.stringify(tempArr))
/**
* 循环已有循环数组
* 如果当前目标值小于有序数组中的某个值,则将目标值添加到有序数组中指定位置
*/
for(let j = 0; j < sortArr.length; j++) {
if(arr[i] < sortArr[j]) {
// 将目标值添加到有序数组中的指定位置
tempArr.splice(j, 0 ,arr[i])
mark = true
break;
}
}
// 目标数最大,则直接放置到有序数组的末尾
if(!mark) {
tempArr.push(arr[i])
}
}
return tempArr
}
方案2
方案2
主要思想就是交换满足条件的目标值,
与方案1不同的是,这里不再用数组来存储有序数组,
而是将数组中的目标值前面的部分作为有序数组
function insertSort(arr) {
for(let i = 1; i < arr.length; i++) {
for(let j = i; j > 0; j--) {
if(arr[j] < arr[j - 1]) {
let temp = arr[j]
arr[j] = arr[j - 1]
arr[j - 1] = temp
}
}
}
return arr
}
方案3
方案3
与方案2不同的是,这里将取最终的值进行赋值
function insertSort(arr) {
let temp = null
for (var i = 1; i < arr.length; i++){
temp = arr[i]
for (var j = i; j > 0 && temp < arr[j - 1]; j--){
// 当前值和之前的每个值进行比较,发现有比当前值小的值就进行重新赋值
arr[j] = arr[j - 1]
}
arr[j] = temp
}
return arr
}
结尾
插入排序思路简单,但是如果真的要理解并用代码实现,最好的方式大概就是用手动验算一次吧;
不同方案代码实现,有其不同思路
纸上得来终觉浅☺