前端-js-插入排序

插入排序,是分别取数组中每一项元素,进行比较排序,依次插入到对应位置。

可从左向右比较,也可从右向左比较,下图是从右向左比较示意。

代码实现有很多种方式,这边提供了四种实现方式,可供参考

无差别统一插入,外循环每次都从数组左侧向右侧遍历,内循环从数组 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#冒泡排序

https://www.cnblogs.com/cc-freiheit/p/10983395.html

posted @ 2020-10-10 13:52  哈哈你说对不对  阅读(541)  评论(0编辑  收藏  举报