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>