模板
注意:
- left <= right
- pivot = nums[mid]
- pivot 的位置会在while循环中变换, 不是原来的位置
- start + k - 1 <= right
private int findKthElement(int[] nums, int start, int end, int k) {
if (start == end) {
return nums[start];
}
int i = start;
int j = end;
int pivot = nums[(start + end) / 2];
while (i <= j) {
while (i <= j && nums[i] < pivot) {
i++;
}
while (i <= j && nums[j] > pivot) {
j--;
}
if (i <= j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
if (start + k - 1 <= j) {
return findKthElement(nums, start, j, k);
}
if (start + k - 1 >= i) {
return findKthElement(nums, i, end, k - (i - start));
}
return nums[j + 1];
}