递归
function quick(arr, left = 0, right = arr.length - 1) {
if (left >= right) return;
var i = left, j = right, flag = i;
while(i < j) {
while(arr[j] >= arr[flag] && j > flag) j --;
if (i >= j) break;
while(arr[i] <= arr[flag] && i < j) i ++;
var temp = arr[flag];
arr[flag] = arr[j];
arr[j] = arr[i];
arr[i] = temp;
flag = i
}
quick(arr, left, flag - 1);
quick(arr, flag + 1, right);
}
非递归
function quick(arr, left = 0, right = arr.length - 1) {
var list = [[left, right]]; // 模拟栈
while(list.length > 0) {
var now = list.pop()
if (now[0] >= now[1]) continue;
var i = now[0], j = now[1], flag = i;
while(i < j) {
while(arr[j] >= arr[flag] && j > flag) j --;
if (i >= j) break;
while(arr[i] <= arr[flag] && i < j) i ++;
var temp = arr[flag];
arr[flag] = arr[j];
arr[j] = arr[i];
arr[i] = temp;
flag = i
}
list.push([now[0], flag - 1]);
list.push([flag + 1, now[1]]);
}
}
非常规
function quick(arr) {
if (arr.length <= 1) return arr;
var index = Math.floor(arr.length / 2),
pviot = arr.splice(index, 1)[0],
left = [],
right = [],
i = -1
while (++i < arr.length) {
if (arr[i] >= pviot) {
right.push(arr[i])
} else {
left.push(arr[i])
}
}
return quick(left).concat(pviot, quick(right))
}
其中 递归调用在 数据量为 100w 左右时 会造成栈溢出