插入排序(優化技巧)

插入排序的基本寫法如下:

function insertSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let key = arr[i]
    let j = i - 1;
    while (j >= 0 && arr[j] > key) {
      arr[j + 1] = arr[j]
      j--;
    }
    arr[j + 1] = key
  }
  return arr
}

怎麼優化插入排序呢?因爲每次都要維護一個已排序的列表,如果有新的元素進來,就要依次對比大小,關於查找我們的優化策略是通過二分查找的方法找到元素需要插入的位置即可。

function insertSort (arr) {
  let first = arr[0]
  let result = first ? [first] : [];
  for (let i = 1; i < arr.length; i++) {
    let key = arr[i]
    insert(result, key)
  }
  return result;
}

function insert(arr, target) {
  let left = 0;
  let right = arr.length - 1;
  while (left <= right) {
    let mid = (left + right) >> 1;
    if (target < arr[mid]) {
      right = mid - 1
    } else {
      left = mid + 1
    }
  }
  arr.splice(right + 1, 0, target)
  return arr
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章