寻找第k大的数(快排思想和优先队列)

本文介绍两种高效算法来寻找数组中的第K大元素:一种利用优先队列维护小顶堆,时间复杂度为nlogk;另一种采用快速排序思想,平均时间复杂度接近nlogn。这两种方法适用于数据处理与算法优化场景。
package Algorithm;

import java.util.PriorityQueue;

public class MaxK {

    private static int priorityQueue(int[] a,int k){
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        for (int i = 0;i < a.length;i++){
            if(queue.size()<k){
                queue.add(a[i]);
            }else{
                if(a[i]>queue.peek()){
                    queue.poll();
                    queue.add(a[i]);
                }
            }
        }
        return queue.peek();
    }

    private static int adjust(int[] a,int l,int r){
        int x = a[l];
        while(l<r){
            while (l<r && a[r]<=x){
                r--;
            }
            if(l<r){
                a[l]=a[r];
                l++;
            }
            while (l<r && a[l]>=x){
                l++;
            }
            if(l<r){
                a[r]=a[l];
                r--;
            }
        }
        a[l]=x;
        return l;
    }

    private static int quickZhao(int[] a,int l,int r,int k){
        if(l<r){
            int mid = adjust(a,l,r);
            if(mid == k) return a[k];
            if(mid > k) return quickZhao(a,l,mid-1,k);
            return quickZhao(a,mid+1,r,k);
        }
        return a[0];
    }

    public static void main(String[] args) {
        int []a = {2,3,5,5,6,7};
        int k = 5;
        //优先队列方式,维护一个k的小顶堆,java默认为小顶堆 时间复杂度nlogk
        System.out.println(priorityQueue(a,k));

        //快排方式,时间复杂度  nlogn  ,快排下标是从0开始的,所以k-1
        System.out.println(quickZhao(a,0,a.length-1,k-1));

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值