插入排序的子过程会向一个有序数组中插入一个元素,请 利用训练9中写的bsearch方法,对这个过程进行优化:
直接利用bsearch找到需要插入元素的位置,然后执行插入
然后回答问题:
请给出变化后的插入排序代码? 请说明这种变化后,请支持新插入排序的算法复杂度? 请说明这样是变快还是变慢了? 答案:
经过优化插入排序的复杂度仍然是O(n^2),常数执行时间也几乎没有变化(其实省略了一次比较)但太微乎其微。因此,这个优化没有意义。
function insert(A, i, x) {
let idx = bsearch(A,i,x)
let p = i - 1
while(p >= idx) {
A[p+1] = A[p]
p--
}
A[p + 1] = x
}
function insertion_sort(A){
for(let i = 1; i < A.length; i++) {
insert(A, i, A[i])
}
}
function bsearch(A, i, x){
let l = 0,
r = i-1,
guess
while(l<=r) {
guess = Math.floor( (l + r) / 2 )
if(A[guess] === x) return guess
if(A[guess] > x) {
if(guess === 0 || A[guess - 1] < x) {
return guess
}
r = guess - 1
} else {
if(guess === i-1 || A[guess + 1] > x) {
return guess + 1
}
l = guess + 1
}
}
}