排序算法3-插入排序

2021-04-17  本文已影响0人  小杰66

插入排序

算法步骤:
1.将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

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

改进
优化1 将元素交换改为元素挪动,先记录要插入的值,然后将前面的元素依次往后挪,找到位置了再插入 (交换有三步,挪动就一步)
优化2 插入元素前的序列是有序的,所以插入元素可以采用二分法来找到应插入的位置

//二分法查找插入位置
function findIndex(arr, i) {
  let value = arr[i];
  let begin = 0;
  let end = i;
  while (begin < end) {
    let mid = (begin + end) >> 1; //除2取整
    if (arr[mid] > value) {
      end = mid;
    } else if (arr[mid] < value) {
      if (begin === mid) {
        begin = mid + 1;
      } else {
        begin = mid;
      }
    } else {
      begin = mid + 1;
    }
  }
  return begin;
}

//挪动而非交换
function insertIndexValue(arr, index, i) {
  let temp = arr[i];
  while (index < i) {
    arr[i] = arr[i - 1];
    i--;
  }
  arr[index] = temp;
}

function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let index = findIndex(arr, i);
    insertIndexValue(arr, index, i);
  }
}

上一篇下一篇

猜你喜欢

热点阅读