伪快速排序
function quickSort (arr) {
if (arr.length === 0) {
return [];
}
let left = [];
let right = [];
let pivot = arr[0];
for (let index = 1; index < arr.length; index++) {
const element = arr[index];
if (element < pivot) {
left.push(element);
} else {
right.push(element);
}
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
const arr = [2, 3, 43, 5, 1, 7, 6, 3, 22];
console.log('排序之前', arr);
const res = quickSort(arr);
console.log('排序之后', res);
排序之前 [
2, 3, 43,
5, 1, 7,
6, 3, 22
]
排序之后 [
1, 2, 3,
3, 5, 6,
7, 22, 43
]
function quickSort (arr) {
if (arr.length <= 1) {
return arr;
}
quick(arr, 0, arr.length - 1); // 将整个arr数组快速排序,left和right分别指向数组左右两端。
}
function quick (arr, left, right) {
if (left >= right) return;
let i = left;
let j = right;
const reference = arr[left]; // 定义可移动的左右指针 i,j,定义reference为基数。
while (i < j) {
while (i < j && arr[j] >= reference) { // 左移 找到一个比基准值小的数交换
j--;
}
// 交换
arr[i] = arr[j];
while (i < j && arr[i] <= reference) { // 右移 直到找到大于参照的元素
i++;
}
// 交换
arr[j] = arr[i]; // 将较大的值放在右边如果没有比基准值大的数就是将自己赋值给自己(i 等于 j)
console.log(arr);
}
arr[j] = reference; // 将基准值放至中央位置完成一次循环(这时候 j 等于 i )
quick(arr, left, j - 1); // 将左边的无序数组重复上面的操作
quick(arr, j + 1, right); // 将右边的无序数组重复上面的操作
}
const arr = [2, 5, 8, 9, 3];
quickSort(arr);
console.log(arr);
/** 分析
*
*/