一些关于js刷算法题的小tips
js的(l + r)/2和l + r>>1结果不一样
js中所有数字都是浮点数(小数),所以js中3/2的结果不是1,而是1.5,在类似快排这种取分界点时要注意不能写
x = q[(l + r )/2]
因为过程中可能会出现小数,比如q[1.5] = undefined,导致排序失败
最好写成q[l + r >> 1]
调试技巧
对算法很熟练以后,可以在对应位置加入输出语句,来观看每一次递归的具体数据,比自己手算要精准和快速,用来验证自己的想法,第一次用的话还是推荐手动模拟流程来熟悉算法的思想
arr = [6, 14, 3, 45, 27,68, 54]
function quickSort(q, l, r) {
console.log("l="+l+",r="+r+",x取q["+(l+r>>1)+"]="+q[l+r>>1]);
if (l >= r) return;
let i = l - 1, j = r + 1, x = q[(l + r) >> 1];
while(i < j) {
while(q[++i] < x);
while(q[--j] > x);
if (i < j) [q[i], q[j]] = [q[j], q[i]];
}
console.log(arr)
quickSort(q, l, j), quickSort(q, j + 1, r);
}
quickSort(arr, 0, arr.length - 1);
输出: