每日算法(四十五)-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);
}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值