插入排序,是分别取数组中每一项元素,进行比较排序,依次插入到对应位置。
可从左向右比较,也可从右向左比较,下图是从右向左比较示意。
代码实现有很多种方式,如下是从小到大排序示例
无差别统一插入,外循环每次都从数组左侧向右侧遍历,内循环从数组 i - 1 向左遍历,遍历次数因i增加逐渐增大,且每次都是完全遍历,效率最低,会改变原数组。
var a = [4,3,9,2,6,1,7,2]
function insetSort(arr) {
var index = 0
for (let i = 1; i < arr.length; i++) {
index = i
for (let j = i - 1; j >= 0; j--) {
if (arr[j] > arr[i]) {
index = j
}
}
arr.splice(index, 0, arr[i]) // 插入元素的位置
arr.splice(i + 1, 1) // 从小到大排序,且i大于等于index,插入的元素原本在的位置后移一位
}
}
insetSort(a)
满足条件插入,每次都从数组左侧(最小侧)向右(最大侧/未排序侧)遍历,遍历次数因i增加逐渐增大,插入后即跳出循环,效率相对较低,会改变原数组。
var a = [4,3,9,2,6,1,7,2]
function insetSort2(arr) {
for (let i = 1; i < arr.length; i++) {
for (let j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
arr.splice(j, 0, arr[i])
arr.splice(i + 1, 1)
break
}
}
}
}
insetSort2(a)
保存排序后的新数组(统一在内循环后插入),每次从排序后的新数组左侧向右遍历比较,满足条件跳出循环,效率较高,不改变原数组
var b = [5,1,1,2,0,0]
function insertSort3(nums) {
var handle = []; // 使用新数组,保存排序后的数组
for (let i = 0; i < nums.length; i++) {
var index = 0
for(let j = 0; j < handle.length; j++){
index = j + 1 // 默认原数组元素大,插入到新数组元素的后面
if(nums[i]<handle[j]){
index = j
break
}
}
handle.splice(index, 0, nums[i]); // 原数组和新数组比较完成后,进行插入操作
}
return handle
}
insertSort3(b)
保存排序后的新数组(使用标识判断在内循环后是否还需插入),每次从排序后的新数组左侧向右遍历比较,满足条件跳出循环,效率较高,不改变原数组
var b = [5,1,1,2,0,0]
function insertSort4(nums) {
var handle = [];
for (let i = 0; i < nums.length; i++) {
var flag = false // 默认没有比该元素大的
for(let j = 0; j < handle.length; j++){
if(nums[i]<handle[j]){
handle.splice(j, 0, nums[i]); // 插入对应位置
flag = true // 存在比该元素大的
break
}
}
if (!flag) {
handle.push(nums[i]) // 如果没有比该元素大的,则插入新数组最后位置
}
}
return handle
}
insertSort4(b)
参考文章
http://wxwzone.com/blog/algorithm.html#%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F