算法思路:
枢纽值
pivot;指针去遍历数组
, 小于 pivot 的值都放在数组左侧(pivot 的右侧);中间位置
, pivot 左侧都是比 pivot 小的值, pivot 右侧都是比 pivot 大的值; 返回 pivot 的下标;比如针对数组 [5,9,2,7,3]
, 分解算法步骤图:
用了双指针。
/* 分区算法 */function partition(nums, left, right) {const pivot = nums[left] // 枢纽值let pos = left // 用来记住最后枢纽值 pivot 应该置于的位置for (let i = left + 1; i <= right; i++) {if (nums[i] < pivot) {pos++swap(nums, pos, i)}}swap(nums, pos, left)return pos}/* 交换位置nums 数组, a, b 为下标*/var swap = function(nums, a, b) {const tmp = nums[a]nums[a] = nums[b]nums[b] = tmp}
测试
var testArr = [5, 9, 2, 7, 3]var result = partition(testArr, 0, 4)result === 2console.log(testArr) // [3, 2, 5, 7, 9]
见 leetcode 215: 数组中的第 K 个最大元素