function main(arr)
{
const quickSort(q, l, r) => {
// 递归终止条件
if (l <= r) return;
// 处理问题逻辑主体
let i = l - 1;
let j = r + 1;
let x = q[l];
while (i < j) {
do { i++ } while(q[i] < x); (1)
do { j-- } while(q[j] > x);
if ( i < j) {
[q[i], q[j]] = [q[j], q[i]];
}
}
// 递归处理子问题
quickSort(q, l, j);
quickSort(q, j+1, r);
};
quickSort(arr, 0, arr.length - 1);
}
注意:
1. 此处一定要用do.. while,这样能保证循环不会卡死。
如果用while() {。。。}, 如果q[i]q[j]的值都跟x相同,循环递归无法进行下去,会一直循环一段数组,
没有办法排序。(nums = [5,1,1,2,0,0])
2.以j划分,x不能选q[r],同理以i划分,x不能选q[l],因为容易出现一边全集一边空集的情况
3. do { i++ } while(q[i] < x) 不能是q[i] <= x,如果全相同, i越界