public int partitionArray(int[] nums, int k) {
if (nums == null || nums.length < 1) {
return 0;
}
int begin = 0, end = nums.length - 1;
while (begin <= end) {
while (begin <= end && nums[begin] < k) {
begin++;
}
while (begin <= end && nums[end] >= k) {
end--;
}
if (begin<= end) {
swap(nums, begin, end);
begin++;
end--;
}
}
return begin;
}
private void swap(int[] nums, int begin, int end) {
int tmp = nums[begin];
nums[begin] = tmp;
nums[end] = nums[begin];
}
class Solution {
public int findKthLargest(int[] nums, int k) {
return quickSelect(nums, 0, nums.length - 1, nums.length - k);
}
//quickSelect, return value
private int quickSelect(int[] nums, int begin, int end, int k) {
if (begin >= end) {
return nums[k];
}
int left = begin, right = end;
int pivot = nums[(begin + end) / 2];
while (left <= right) {
while (left <= right && nums[left] < pivot) {
left++;
}
while (left <= right && nums[right] > pivot) {
right--;
}
if (left <= right) {
swap(nums, left, right);
left++;
right--;
}
}
if (k <= right) {
return quickSelect(nums, begin, right, k);
}
if (k >= left) {
return quickSelect(nums, left, end, k);
}
return nums[k];
}
private void swap(int[] nums, int begin, int end) {
int tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
}
}