代码一
- 选0作为基准,从左到右,依次与基准作比较,小于基准则与基准位置互换数值。一轮后,最小数值沉淀到基准位置(即位置0处)。
- 下一轮,将基准位置右移一位,重复执行(1)
- 一轮轮下来,数值从小到大逐渐从左到右沉淀下来。
main = (arr) => {
return quickSort(arr, 0, arr.length - 1);
}
quickSort = (arr, left, right) => {
if (left < right) {
let newPrivot = sortSmallToLeft(arr, left, right);
quickSort(arr, newPrivot + 1, right);
}
return arr;
}
sortSmallToLeft = (arr, left, right) => {
let pivot = left;
let index = pivot + 1;
for(let i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i ,pivot);
}
}
return pivot;
}
swap = (arr, i, j) => {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
console.log(main([19, 97, 9, 17, 1, 8]));
代码二
取基准位,以基准为值为基准值,从数组左右两头分别向中间推进,左右每一位和基准值做比较,大于基准值的沉在数组右侧,小于基准值的浮在数组左侧。直至左右相遇,拆分成左右两个小分区,重复步骤。
- 取首位值为基准值,首位和末位为左右游标。左浮标 > 右浮标则该段排序完成。
- 右游标处数值小于基准值,则该值浮到数组左侧游标处,左游标向右移一位;否则右游标向左移一位。
- 左游标处数值大于基准值,则该值沉到数组右侧游标处,右游标向左移一位,否则左游标向右移一位。
- 左右游标相遇处,更新该处数值为基准值;从该处划分出左右两个分区,分别从(1)重复执行。
quickSortByPartition = (arr, L, R) => {
if (L > R) return;
let left = L;
let right = R;
let pivot = arr[left];
while(left < right) {
while(left < right && arr[right] >= pivot) {
right--;
}
// 注意要时刻保证左浮标 < 右浮标
if (left < right && arr[right] < pivot) {
arr[left] = arr[right];
left++;
}
while(left < right && arr[left] <= pivot) {
left++;
}
if (left < right && arr[left] > pivot) {
arr[right] = arr[left];
right--;
}
if (left === right) {
arr[left] = pivot;
}
}
quickSortByPartition(arr, L, right - 1);
quickSortByPartition(arr, left + 1, R);
}
const arr2 = [3, 44, 38, 5, 36, 26, 2, 46, 4, 4, 19, 50, 48, 48];
quickSortByPartition(arr2, 0 ,arr2.length - 1)
console.log(arr2);
思路
红白蓝,分成三份,左边为红色,右边为蓝色,中间则为白色。因此比较的时候,只需要关注0和2
实现
- 设置左、右两个指针,从0开始循环遍历数组;
- 当前值为2,与右指针当前数值互换位置,同时右指针左移一位,使得右指针右侧均为2
- 当前值为0,则与左指针当前值互换位置,同时左指针右移动一位,使得左指针左侧均为1
- 从左、右指针置换到当前位置的值仍需继续比较。
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
sortColors = (nums) => {
let left = 0;
let right = nums.length - 1;
for(let i = 0; i <= right ;i++) {
while(i <= right && nums[i] === 2) {
swap(nums, i, right--);
}
if (nums[i] === 0) {
swap(nums, i, left++);
}
}
}
swap = (arr, i ,j) => {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
let nums1 = [1,1,2];
sortColors(nums1);
console.log(nums1);