链接

 

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>