function quickSort(arr,l,r){
if(l < r){
var i = l, j = r, x = arr[i];
while(i<j){
while(i<j && arr[j]>x)
j--;
if(i<j)
//这里用i++,被换过来的必然比x小,赋值后直接让i自加,不用再比较,可以提高效率
arr[i++] = arr[j];
while(i<j && arr[i]<x)
i++;
if(i<j)
//这里用j--,被换过来的必然比x大,赋值后直接让j自减,不用再比较,可以提高效率
arr[j--] = arr[i];
}
arr[i] = x;
quickSort(arr, l, i-1);
quickSort(arr, i+1, r);
}
}
<script>
function quickSort(arr,l,r){
//总体思路是, 选第一个 a 作为参考
// 从最后一个往前逐个对比, 如果遇到比a小, 就把这个 c 放在第一位
// 还是 a 作为参考,
// 从第二个往后逐个对比, 如果遇到比 a 大, 就把这个 d 放在 c 开始的位置
// 最后 a 就放在 d的位置,
// 这样 a 左边的都比 a小,
// a右边的都比 a大
if(l < r){
var i = l, j = r, left = arr[i]; //left 3 抽取出第一位的值
// [3,2,6,1, 9,8,6 ]
while(i<j){
// 同时满足
// 对比的坐标在 第一个3的 后面
// 对比的值 大于 3
// 则排除掉
while(i<j && arr[j]> left) //arr[j] 6
j--; // j 6
// 最后 j 为3, arr[j] 为 1
// i 没有变, j在变
if(i<j)
// 填充第一位的值, 3 变成 1, 同时 i 从0 变成 1
arr[i++] = arr[j];
// [1, 2, 6, 1, 9, 8, 6]
// 1 < 3 && 2 < 3
while(i < j && arr[i] < left )
i++;
// 最后 i 为 2
// i 在改变, j没有变化
// 2<3
if(i<j)
// 3 的位置被填充, 变成6, 同时j 变成了 2
arr[j--] = arr[i];
// [1, 2, 6, 6, 9 , 8 ,6 ]
}
//确定中间的值 [1, 2, 3, 6, 9 , 8 ,6 ]
arr[i] = left;
console.log(arr)
// 排序左边的数组
quickSort(arr, l, i-1);
//排序右边的数组
quickSort(arr, i+1, r);
}
}
var arr = [8,5,1,4,6, 9 ,3,8,7, 6, 2 ]
quickSort(arr, 0, arr.length-1)
console.log(arr)
</script>