有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
- 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
测试样例:
[1,3,5,2,2],5,3
返回:2
思路:
利用快排的思想,取一个关键值,将其进行一趟快排之后,比它大的数都放到它左边,比他小的数都放到右边
要求第k大的数,就是求数组下标为k-1的数值
首先获取关键值的下标m
如果m-left == k-1 则下标m处就是第k大的数
如果m-left > k-1 则说明m左边数的个数大于k,要往左边找
如果m-left < k-1 这说明m左边数的个数小于k,要往右边找
代码:
public class Main
{
public static void main(String[] args) {
int[] array = {1, 4, 2, 7, 9, 8, 3};
int k = 3;
if (k <= array.length && k >= 0)
{
System.out.println(findKth(array, array.length, k));
}
else
{
System.out.println("k值错误");
}
}
public static int findKth (int[] array, int n, int k)
{
return findKth(0, n-1, array, k);
}
public static int findKth (int left, int right, int[] array, int k)
{
int m = partation(left, right, array);
if ((m-left) > (k-1) && left<right)
{
return findKth(left, m-1, array, k);
}
else if ((m-left) < (k-1) && left<right)
{
return findKth(m+1, right, array, k-m+left-1);
}
else
{
return array[m];
}
}
public static int partation (int left, int right, int[] array)
{
int key = array[left];
while (left < right)
{
while (left<right && array[right]<=key)
{
right--;
}
array[left] = array[right];
while (left<right && array[left]>=key)
{
left++;
}
array[right] = array[left];
}
array[left] = key;
return left;
}
}
运行结果:
数组为:{1, 4, 2, 7, 9, 8, 3} , k = 3(求数字第3大的数)