每日算法(四十五)-java找出topK的值

每日算法(四十五)-java找出topK的值 
这里用的方法的堆排序的思想(如果堆排序不是很清楚可以看之前的排序算法里的堆排序),构造容量位K的小顶堆,即数组前K个元素构造出的堆,堆积为最小值,之后将堆顶分别于剩下的所有元素依次进行比较,比堆顶大则交换,再进行调整,代码如下

public class TopK {
public int findTopK(int arr[] ,int k){
    //构建一个K容量的堆,堆顶为最小值
    buildHeap(arr,k);
    //从K到之后的元素依次与堆顶比较,比堆顶大则交换,然后再调整里面的堆
    for(int i=k;i<arr.length;i++){
        if(arr[i]>arr[0]){
            arr[0]=arr[i];
            adjustHeap(arr,0,k);
    }
        }
    return arr[0];
}

//构建堆
private void buildHeap(int[] arr, int length) {
    //从最后一个非叶子节点开始。
    for(int i=length/2-1;i>=0;i--){
        adjustHeap(arr,i,length);
    }
}
//调整堆
private void adjustHeap(int[] arr, int i, int length) {
    int temp=arr[i];  //保存父节点的值
    for(int k=2*i+1;k<length;k=k*2+1){
        if(k+1<length&&arr[k]>arr[k+1]){           //左孩子>右孩子,则取右孩子
            k++;
        }
        if(temp<=arr[k]){
            break;
        }else{            //根节点>左右孩子结点,则交换
            arr[i]=arr[k];
            i=k;
        }
        }
        arr[i]=temp;
    }
    

public static void main(String[] args) {
    int arr[]={19, 8, 27, 6, 315, 14, 99};
    TopK to=new TopK();
    int reslut=to.findTopK(arr, 4);
    System.out.println(reslut);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值