1.概念
插入排序的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
2. 算法原理
比如我们有如下原始数组:[10,2,8,6,4,3]
将第一个元素10作为有序数据,此时有序区只有一个元素
第一轮:10和2比较,2<10,交换。
第二轮:让8和有序区依次进行比较。8<10,交换,8<2,无需交换。
第三轮结果:
第四轮结果:
第五轮结果:
至此所有的元素都是有序的
3. 算法优化
在第三轮中,6先和10交换,再和8交换,进行了多次交换,在数组数量大的时候,交换的次数会更多。
实际上,我们可以先把6存起来,把有序区的元素从左向右复制,优化如下:
第一步:先把6暂存起来
第二步:6和10比较,6<10,10移到下一个位置
第三步:6和8比较,6<8,8移到下一个位置
第四步:6和2比较,6>2,2不需要移动,将暂存的6复制到2的下一个位置
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
}
}