/**
总体思路就是 [ 5 , 3, 65, 1, 6, 2]
取出第一个【5】作为中心值 o 保存起来, 这样第一个值的位置就可以空出来
从最后一个 比较, 如果比 o 小, 就往左边 wz1 塞 , 【5】 空出来的位置 放入 【2】,
并且 j-- 缩小范围, 因为最后一个值已经参与比较, 而且移动位置了; 所以【2】得位置其实已经“空”出来了
在从第二个比较, i++, 如果比 o 大, 就往右边塞 , 【2】的位置放入 【65】
然后从右边比较, 1小于5, 所以65空出来的位置放 如 1, 左边就变成了 2 3 1 右边 6 65
然后继续while循环, 经过这几次循环就保证了 i 左边的数值都比o小, i右边的数字都比o大, i位置最后存放 o;
第一轮结果: 2 3 1 (5) 6 65
然后再递归处理 [2 3 1] 和 [ 6 65 ]
*/
function quickSort(arr,l,r){
//多余
if(l < r){
//保存 最左 最右 两个坐标
var i = l, j = r;
//得到最左边的值
var lv = arr[i];
while( i<j ){
//进入到这个while条件是安全的 数字, 不用调换位置
while( i < j && arr[j] > lv ){
j--;
}
// 目的为了找到 左边比 lv 小的
// 主要是避免 i == j 的情况
if( i<j ){
// 把右边小的 放在 lv的位置, 右边就有一个空缺
arr[i] = arr[j];
i = i + 1;
}
//排除 ,
while( i < j && arr[i] < lv ){
i = i + 1;
}
//目的为了找到 左边比 lv大的 去填补 右边那个空缺
if( i < j ) {
arr[j] = arr[i];
j = j - 1;
}
}
// 最后这里其实i已经是那个空缺的j, 因为i++之后, 和 j比较
arr[i] = lv;
//一步一步操作, 还是对同一个数组, 比较节省空间
quickSort(arr, l, i-1);
// 一步一步操作
quickSort(arr, i+1, r);
}
}
a = [5 , 3, 65, 1, 6, 2]
quickSort(a, 0, a.length -1 ); console.log(a)