最小的K个数,堆排序——剑指offor Java程序

    对于海量数据中,数量量大于内存可接受的数据,需要选择出最小的k个数,内存无法对所有的数据进行排序,因此可采用一个大小为k的堆容器b[],进行辅助排序。对于原始数据数组a[],大小为n,n>>k。

    初始时将n个元素中的前k个元素存储在堆容器b[]数组中,并对其进行堆排序,建立大顶堆(所有父节点的元素大于子节点)。堆排序是从第一个非叶子节点开始进行调整,此节点与其子节点进行比较,若子节点大于父节点,则将父节点与子节点进行交换,这一交换可能使子节点的子树不满足大顶堆的特点,因此需要递归重新调整子树。

    然后对n个元素剩下的所有元素进行操作,若元素大于大顶堆的堆顶元素,则对其不进行任何操作。反之,该元素替换堆顶元素,并进行堆调整。

    最后堆容器b[]中的元素便是最小的k个元素。

    时间复杂度O(nlogk),优点:不需要改变输入数组,适合处理海量数组。

public class GetLeastNumbers {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int a[]={4,5,1,6,2,7,3,8,0};
		int b[]=get_min_k(a,4);
		for(int i=0;i<b.length;i++)
		{
			System.out.println(b[i]);
		}
		
		
	}
	public static int[] get_min_k(int a[],int k)
	{
		int b[]=new int[k];
		if(a.length<=k)
			return a;
		for(int i=0;i<k;i++)
			b[i]=a[i];
		for(int i=(k-1)/2;i>=0;i--)
			adjustHeap(b,i);
		for(int i=k;i<a.length;i++)
			if(a[i]<b[0])
			{
				b[0]=a[i];
				adjustHeap(b,0);
			}
		return b;
	}
	private static void adjustHeap(int[] b, int i) {
		// TODO Auto-generated method stub
		int index=i;
		int left=2*i+1;
		int right=2*i+2;
		if(left<b.length&&b[index]<b[left])
			index=left;
		if(right<b.length&&b[index]<b[right])
			index=right;
		if(index!=i)
		{
			int temp=b[i];
			b[i]=b[index];
			b[index]=temp;
			adjustHeap( b, index);
		}
	}

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值