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