简单问题:在一个有序数组A中插入x元素
let A = [2,4,6,9,10] //目标体
const x = 8 //插入元素
const b = A.find(a => a > x) //找到大于插入元素的值b
if(b == undefined){ //如果不存在这样的值 插入元素为最大
A.push(x) //直接插入数组最后
} else {
const idx = A.indexOf(b) //找到b存在的位置
A.splice(idx,0,x) //把目标元素插入当前位置
}
简单实现都要这么麻烦 欧No! look look again!
嗯! 可以用splice代替push , 如果不存在大于x 这样的值,indexOf会返回 -1,有门道,上代码试试
let A = [2,4,6,9,10] //目标体
const x = 8 //插入元素
const b = A.find(a => a > x) //找到大于插入元素的值b
//请开始你的表演
const idx = A.indexOf(b)
A.splice(idx==-1?A.length:idx,0,x)
0 | 1 | 2 | 3 | 4 | 5 | p比较指针 |
2 | 4 | 6 | 9 | 10 | 空位 | p=4 (10>8) |
2 | 4 | 6 | 9 | 空位 | 10 | p=3 (9>8) |
2 | 4 | 6 | 空位 | 9 | 10 | p=2 (6<8) |
2 | 4 | 6 | 8 | 9 | 10 |
解析: 新建一个空位在最后 ,从最后比较p指向元素与x大小, p值>x ,p值后移一位 ,指针向前移动一位继续比较,如果p值小于x,则x插入当前指针后的空位. 语言太抽象还是look code吧!
function inster(A, x){
p = A.length -1 ; //指针指向最后一个元素
while(p>=0 && A[p]>x){ //如果指针元素大于x
A[p+1] = A[p] //最后元素后移至空位
p-- //指针前移
}
A[p+1] = x //如果指针元素小于x ,直接插入指针后面一位的空位置
}
(1)数组第一个元素,当成一个只有一位长度的有序数组,暂定A集合
(2)指针i从第二位开始查找,指向元素依次插入A集合
(3)循环不变式为指针i指向下一个需要排序的元素
(4)指针i后移直到最后一位, 插入排序完成
0 | 1 | 2 | 3 | 4 | 指针i |
7 | 5 | 8 | 3 | 9 | i=1 |
5 | 7 | 8 | 3 | 9 | i=2 |
5 | 7 | 8 | 3 | 9 | i=3 |
3 | 5 | 7 | 8 | 9 | i=4 |
3 | 5 | 7 | 8 | 9 | i=5 |
解析: 绿色区域永远为有序数组,指针指向元素是将要插入有序数组.即插入排序分两步1.移动指针 2.进行插入
综合所掌握的插入算法,我们只需要实现移动指针,两者组合即插入排序
function insert(A, i, x){
p = i-1; //与上不同处 长度为外部传入
while(p>=0 && A[p]>x){
A[p+1] = A[p]
p--
}
A[p+1] = x
}
function insertion_sort(A){
for(let i = 1; i