核心思想: 分而治之。以基准值划分数组, 以此迭代
- 选取第一个为基准值
- 遍历, 交互,最终达到, […小于基准值, 基准值, 大于基准值]
- 划分为相同更小的问题
指针交换法
``` function quickSort(arr, start, end) { if (start >= end) return; let pivotIndex = partition(arr, start, arr.length - 1); quickSort(arr, start, pivotIndex-1); quickSort(arr, pivotIndex+1, arr.length - 1); }
function partition(arr, start, end) { var pivot = arr[start]; let left = start, right = end; while (left < right) { while (left < right && arr[right] > pivot) right—; while (left < right && arr[left] <= pivot) left++; if (left < right) { [arr[left], arr[right]] = [arr[right], arr[left]] } } [arr[start], arr[left]] = [arr[left], arr[start]] return left; }
<a name="E9tYm"></a>
#### 挖坑法
function quickSort(arr, start, end) { if (start >= end) return; let pivotIndex = partition(arr, start, arr.length - 1); quickSort(arr, start, pivotIndex-1); quickSort(arr, pivotIndex+1, arr.length - 1); }
function partition(arr, start, end) { var pivot = arr[start]; let left = start, right = end; while (left < right) { while (left < right && arr[right] > pivot) right—; if (left < right) { arr[left] = arr[right]; left++; } while (left < right && arr[left] <= pivot) left++; if (left < right) { arr[right] = arr[left]; right—; } } arr[left] = pivot; return left; }
<a name="ssALD"></a>
#### 非递归法
参考:<br />[漫画:什么是快速排序?(完整版)](https://www.cxyxiaowu.com/5262.html)
<a name="GYAGO"></a>
### 练习1:
<a name="etj7g"></a>
#### [剑指 Offer 40. 最小的k个数](https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/)
<a name="EGjYF"></a>
#### [215. 数组中的第K个最大元素](https://leetcode-cn.com/problems/kth-largest-element-in-an-array/)
var findKthLargest = function(nums, k) { // 快速排序 // 目标第nums.length - k const len = nums.length; if (len == 1) return nums[0]; k = len - k; let start = 0; let end = len - 1; while (start <= end) { let p = partition(nums, start, end); if (p == k ) { return nums[p]; } if (p > k) { end = p-1; } else { start = p+1; } } return -1; };
function partition(arr, start, end) {
if (start >= end) return start;
let pivot = arr[start];
while (start < end) {
while(start < end && arr[end] >= pivot) end—;
if (start < end) {
arr[start] =arr[end];
start++;
}
while (start < end && arr[start] < pivot) start++;
if (start < end) {
arr[end] =arr[start];
end—;
}
}
arr[start] = pivot;
return start;
}
```
快速排序: 70, 53
选择排序: 20, 50
时间提高明显