1. 程式人生 > 實用技巧 >前端-js-插入排序

前端-js-插入排序

插入排序,是分別取陣列中每一項元素,進行比較排序,依次插入到對應位置。

可從左向右比較,也可從右向左比較,下圖是從右向左比較示意。

程式碼實現有很多種方式,這邊提供了四種實現方式,可供參考

無差別統一插入,每次都從陣列左側(最小側)向右(最大側/未排序側)遍歷,遍歷次數因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