插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

插入排序时是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

实现思路

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

动图演示

insertionSort.gif

JavaScript 代码实现

  1. function insertionSort(arr) {
  2. let len = arr.length;
  3. let preIndex, current;
  4. for (let i = 1; i < len; i++) {
  5. preIndex = i - 1;
  6. current = arr[i];
  7. while (preIndex >= 0 && arr[preIndex] > current) {
  8. arr[preIndex + 1] = arr[preIndex];
  9. preIndex--;
  10. }
  11. arr[preIndex + 1] = current;
  12. }
  13. return arr;
  14. }