概述
插入排序:
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)
的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
基本思想
每一步都是将 待排序的一个数据,插入到一个已经有序的数据序列里面。直到所有的数据全部插入为止。【每一次插入都会进行一次排序】
类似于打牌【斗地主】,每摸一张就按照顺序放到位置。每摸一张牌之后一定是有序的,下一张牌来了,在已知的有序序列里面放到合适的位置。
插入排序方法
在插入 a[i]数据之前。a[0] ~a[i-1]一定是有序的。
现在需要插入a[i]这个数据,需要再a[0]~a[i-1]找到合适的位置放置a[i],比如这个index为j,将a[i]放在索引j
上面。
插入排序有多种:
1,简单插入排序 (每一次从后往前扫描每一个数据,确认插入位置的索引)
// 每一次插入,都与前面的【有序序列】比较,找到合适的位置
var simpleInsertSort = (arr) => {
if (!arr || arr.length === 1) return arr
let key, j;
for (let i = 1; i < arr.length; i++) {
key = arr[i];
// 判定条件是,当前值小于index为j的值,并且不越界
for (j = i - 1; j >= 0 && arr[j] > key ; j--) {
arr[j+1] = arr[j]
}
// 找到正确的位置之后,将这个值插入
arr[j+1] = key
}
return arr
}
2,二分插入排序 (因为前面已经是有序的,确定位置可以用二分法来确定)
// 每一次插入,都与前面的【有序序列】比较,找到合适的位置
// 因为已知的序列是有序的,所以可以利用二分法寻找合适的插入位置
var binaryInsertSort = (arr) => {
if (!arr || arr.length === 1) return arr
let key;
for (let i = 1; i < arr.length; i++) {
key = arr[i];
// 方法一: 简单查找,找到插入点
// 判定条件是,当前值小于index为j的值
// for (j = i - 1; j >= 0 && arr[j] > key ; j--) {
// arr[j+1] = arr[j]
// }
// 方法二: 二分查找,找到插入点
let low = 0, high = i - 1;
while(low <= high) {
let mid = Math.trunc((low + high) / 2)
if (arr[mid] > key) { // 这里大于小于就是排序的区别
high = mid - 1
} else {
low = mid + 1
}
}
// 找到了插入的位置是 high + 1
// 后面的每一个往后面移动一个位置
// 错误, 不能从前往后,这样j+1的值会丢失,【除非你用一个变量存取后面的值】
// for(let j = high + 1; j < i - 1; j++ ) {
// arr[j+1] = arr[j]
// }
// 正确, 可以从后往前
// 因为最后一个i的值已经存在key里面了,覆盖也没关系,
for (let j = i - 1; j >= high + 1; j--) {
arr[j + 1] = arr[j]
}
// 找到正确的位置之后,将这个值插入
arr[high+1] = key
}
return arr
}
最后
以上就是漂亮煎饼为你收集整理的插入排序-简单插入排序和二分插入排序的全部内容,希望文章能够帮你解决插入排序-简单插入排序和二分插入排序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复