快速排序和快速选择算法重点在与partition,partition有多种写法,其中用最后一位当作piviot的写法比较简单。
class Solution {
public int[] sortArray(int[] nums) {
helper(nums, 0, nums.length - 1);
return nums;
}
//注意+1 和 -1
public void helper(int[] nums, int i, int j) {
if (i >= j) {
return;
}
int index = partition(nums, i, j);
helper(nums, i, index - 1);
helper(nums, index + 1, j);
}
// 选择最后一位,将所有小于最后一位的扔到左边
public int partition(int[] nums, int left, int right) {
int piviot = nums[right];
int j = left;
for (int i = left; i < right; i++) {
if (nums[i] <= nums[right]) {
swap(nums, i, j);
j++;
}
}
swap(nums, right, j);
return j;
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
快速选择大部分代码是一样的,多一个输入K(比如我们想找最大K个,最小K个)
public void quickSelect(Pair[] pairs, int left, int right, int k) {
int index = partition(pairs, left, right);
if (k == index) {
return;
} else if (k > index) {
quickSelect(pairs, index + 1, right, k);
} else {
quickSelect(pairs, left, index - 1, k);
}
}