原题
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
代码分析
求无序数组(可能含有重复元素)的第 K 个最大值。提供一种基于快速排序的求解方法。快速排序选择一个轴点,比较完成后,轴点前的元素大于轴点元素,后面的小于轴点元素。若轴点位置恰好为求得 Kth最大值,则返回,如果小于请见下面代码。
代码实现
public class NthMaxQSort
{
//从大到小排序
//位于中轴前的元素都比中轴大,后的元素都比中轴小
public int partition(int[] nums, int left, int right)
{
int pivot = nums[left];
while (left < right)
{
while (left < right && nums[right] <= pivot)
right--;
//将大数放到pivot前面
nums[left] = nums[right];
while (left < right && nums[left] > pivot)
left++;
//将小数放到pivot后面
nums[right] = nums[left];
}
nums[left] = pivot; //pivot放到碰头处
return left;
}
//发现第k个最大值
public int FindKthLargest(int[] nums, int k)
{
int left = 0;
int right = nums.Length - 1;
while (true)
{
int pivotIndex = partition(nums, left, right);
if (k - 1 == pivotIndex)
return nums[pivotIndex];
else if (k - 1 < pivotIndex)
right = pivotIndex - 1;
else
left = pivotIndex + 1;
}
}
}