前言
前几天看到一道这样一道面试题,在数组中,寻找第k大的值,我们看到这一道题,我们最先想到的就说直接排序,我们可以采用快速排序,时间复杂度能达到O(nlogn),空间复杂度能达到O(1)。但是我们并不需要把所有的数组排好序,所以我们可以在快速排序的基础上做一点调整。
思路
实现的原理是这样子的:首先我们找一个基准数,就和快速排序一样,接着把小于基准数的元素移动到数组左边,接着把大于基准数的元素移动到数组右边,这时候,基准数的下标肯定在对应的位置上,也就是第i+1大的数,所以只需要判断当前位置的数与k的大小就可以了。如果i+1等于k,说明找到了;如果i+1小于k,则说明我们要找的k正在数组的左部分;如果i+1大于k,则说明我们要找的k正在数组的右部分。
直接上代码!!!
package interview;
/**
* @author xing xing
*/
public class KNumber {
public static void main(String[] args) {
//定义数组
int [] array = {
2,7,100,51,-1,20,21