十大排序算法(JavaScript实现 )- 插入排序 Insertion Sort

239 阅读1分钟
  1. 十大排序算法(JavaScript实现 )- 冒泡排序 Bubble Sort

  2. 十大排序算法(JavaScript实现 )- 选择排序 Selection Sort

  3. 十大排序算法(JavaScript实现 )- 插入排序 Insertion Sort

  4. 十大排序算法(JavaScript实现 )- 希尔排序 Shell Sort

  5. 十大排序算法(JavaScript实现 )- 快速排序 Quick Sort

  6. 十大排序算法(JavaScript实现 )- 归并排序  Merge Sort

  7. 十大排序算法(JavaScript实现 )- 计数排序 Count Sort

  8. 十大排序算法(JavaScript实现 )- 桶排序 Bucket Sort

  9. 十大排序算法(JavaScript实现 )- 基数排序 Radix Sort

  10. 十大排序算法(JavaScript实现 )- 堆排序 Heap Sort

1.概念

插入排序的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

2. 算法原理

比如我们有如下原始数组:[10,2,8,6,4,3]

将第一个元素10作为有序数据,此时有序区只有一个元素

图片.png

第一轮:10和2比较,2<10,交换。
图片.png
第二轮:让8和有序区依次进行比较。8<10,交换,8<2,无需交换。 图片.png
第三轮结果:
图片.png
第四轮结果:
图片.png
第五轮结果:
图片.png 至此所有的元素都是有序的

3. 算法优化

在第三轮中,6先和10交换,再和8交换,进行了多次交换,在数组数量大的时候,交换的次数会更多。
实际上,我们可以先把6存起来,把有序区的元素从左向右复制,优化如下:
第一步:先把6暂存起来

图片.png

第二步:6和10比较,6<10,10移到下一个位置

图片.png

第三步:6和8比较,6<8,8移到下一个位置

图片.png

第四步:6和2比较,6>2,2不需要移动,将暂存的6复制到2的下一个位置

图片.png

4. 算法代码

function insertSort(arr) {
  const len = arr.length
  for (let i = 1; i < len; i++) {
    let insertIndex = i
    let insertValue = arr[i]
    while(insertIndex > 0 && insertValue < arr[insertIndex - 1]) {
      arr[insertIndex] = arr[insertIndex-1]
      insertIndex--
    }
    arr[insertIndex] = insertValue
  }
}