从百万数据中找到第K大的数并且时间复杂度为O(N)

假设数组为array,求第K大的元素。

注意:因为快排排序后,数组是由小到大的,所以第K大的元素为倒数第十个即 array[array.length-K+1];

所以我们要令k =array.length-K+1

思路:利用快排的分治思想,先对数组进行一趟快排,将数组分为三个区,(0,par),(par),(par+1,array.length-1)。判断k与par的大小,如果par +1<k,那么下次对(par+1,array.length-1)这一部分进行快排,如果par+1>k,则对(0,par-1)进行快排。直到par == k,那么第K大的数就是array[par].

为什么说时间复杂度为O(N),第一次分区查找,我们需要对n个元素进行分区,第二次分区查找,需要对n/2个元素进行分区。依次类推,直到区间缩小为1.那么总时间复杂度为:n+n/2+n/4+n/8+...+1,等比数列求和,和为2n-1。所以时间复杂度为O(N).

代码实现如下:

import java.util.Random;

public class FindK {
    public static void main(String[] args) {
        Random r = new Random();
        int K = 10;//第K大的数
        int[] array = new int[200];
        for(int i =0 ;i<array.length;i++){
            array[i] = r.nextInt(4000);
        }
        //快排排出来是由小到大的,所以第K大的数,也就是倒数第十个数,
        //即k=array.length-K+1
        int k = array.length-K+1;
        int par =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值