求数组中的K大数(时间复杂度控制…

该篇博客介绍了一个Java实现的算法,用于从数组中寻找K个最大值。通过快速选择算法,实现了在平均时间复杂度为O(n)的情况下找到数组内的K大数。博主给出了完整的代码实现,包括随机划分、获取最大K个数的方法,并提供了输入数组长度、元素及K值的交互式操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【源码】
package cn.edu.nwsuaf.cie.qhs;

import java.util.Random;
import java.util.Scanner;

public class GetGreateK {

    private int initArray[];
    public int[] getInitArray() {
        return initArray;
    }
    public void setInitArray(int[] initArray) {
        this.initArray = initArray;
    }
    public GetGreateK(){}
    public GetGreateK(int[] array){
        this.initArray = array;
    }
    public int random_partion(int start,int length){
        Random rand = new Random();
        int index = rand.nextInt(length);
        int i = start-1;
        int j = start;
        this.swap(index, length-1);
        for(j=start;j<length;j++){
            if(initArray[j] < initArray[length-1]){
                this.swap(++i, j);
            }
        }
        this.swap(++i, length-1);
//        System.out.println("------>"+i);
        return i;
    }
    public int getMaxK(int start,int length,int k){
        int mid;
        if (k<=0) return -1;
        if (length<k) return -1;
        mid = this.random_partion(start, length);
        if (mid == length-k) return initArray[mid];
        else if(mid < length-k) return getMaxK(start+mid+1,length-mid-1,k);
        else return getMaxK(start,mid,k-(length-mid));
    }
   
    public void swap(int a,int b){
        int temp = initArray[a];
        initArray[a] = initArray[b];
        initArray[b] = temp;
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //12012  945  965  66  232  65  898  56  878  170  13  5
        int[] array;
        int length;
        int K;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数组长度:");
        length = scanner.nextInt();
        array = new int[length];
        for(int i = 0; i < length;i++){
            System.out.println("请输入第"+(i+1)+"个数:");
            array[i] = scanner.nextInt();
        }
        System.out.println("请输入K:");
        K = scanner.nextInt();
        GetGreateK kth = new GetGreateK();
        kth.setInitArray(array);
        int maxK = kth.getMaxK(0,array.length,K);
        System.out.println("maxK---->"+maxK);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值