Java 实现 堆排序 快速排序 以及 TopK问题(一)

本文介绍了一种利用堆排序算法高效找出数组中最大的K个数的方法。通过具体实例演示了堆排序的基本步骤,包括建立初始堆、调整堆以及获取最终结果的过程。此方法的时间复杂度为O(klogn),适用于大数据量的处理。

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

问题是 从大小为N的无序数组里面取K个最大值

最早想到的办法是冒泡K轮,但是后来思考到,堆排序和快速排序,可以更好的实现取K个最大值。



堆排序Java实现

public class Main {
	 public static void main(String[] args)  {
	     int[] arr={5,62,81,63,13,43,34,5,8,9,6,44};
	     int k=5;
	     
	     heapBuild(arr,arr.length);  //建树
	     
	     for(int x=0;x<k;x++){
	    	 System.out.print(arr[0]+" ");
	    	 swap(arr,0,arr.length-1-x);   //交换第一个值和最后一个值(将根和最后一个叶子交换)
	    	 Fix(arr,0,arr.length-1-x);//递归修正
	     }
	 }

	private static void heapBuild(int[] arr,int len) {
		for(int i=len/2-1;i>=0;i--){//从后遍历所有度大于一的节点
			Fix(arr,i,len);     //修正该子树
		}
	}

	private static void Fix(int[] arr, int i,int len) { //
		int left=i*2;
		int right=i*2+1;
		int max=i;
		if (left < len && arr[left] > arr[i]) {  
            max = left;  
        }  
        if (right < len && arr[right] > arr[max]) {  
            max = right;  
        } 
        if(i!=max){
        	swap(arr,max,i);
        	Fix(arr,max,len);	
        }
	 }

	private static void swap(int[] arr, int a, int b) { //交换赋值
		int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;
	}
	
}


输出为 81 63 62 44 43  


堆排序实现取topK,复杂度为O(klogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值