`

java-5.查找最小的K个元素-使用最大堆

 
阅读更多
import java.util.Arrays;
import java.util.Random;


public class MinKElement {

	/**
	 * 5.最小的K个元素
	 * I would like to use MaxHeap.
	 * using QuickSort is also OK
	 */
	public static void main(String[] args) {
		MinKElement mke=new MinKElement();
		int[] a={1,2,3,4,5,6,7,8};
		int k=4;
		mke.disArrange(a);
		System.out.println("after disarranging,the array a[]="+Arrays.toString(a));
		mke.findKMin(a,k);
		
	}

	//rearrange the array.just for test.
	public void disArrange(int[] a){
		for(int i=0,len=a.length;i<len;i++){
			Random random=new Random();
			int j=random.nextInt(len);
			swap(a,i,j);
		}
	}
	public void findKMin(int[] a,int k){
		int[] heap=a;//you can do this:int[] heap=new int[k].but that maybe space-cost
		
		//create MaxHeap of K elements.from the lastRootIndex to 0.
		int rootIndex=k/2-1;
		while(rootIndex>=0){
			reheap(heap,rootIndex,k-1);
			rootIndex--;
		}
		for(int i=k,len=heap.length;i<len;i++){
			if(heap[i]<heap[0]){
				heap[0]=heap[i];
				reheap(heap,0,k-1);  
			}
		}
		System.out.print("the K min elements=");
		for(int i=0;i<k;i++){
			System.out.print(heap[i]+",");
		}
	}
	
	//reheap:from root to lastIndex.
	public void reheap(int[] heap,int rootIndex,int lastIndex){
		int orphan=heap[rootIndex];
		boolean done=false;
		int leftIndex=rootIndex*2+1;
		while(!done&&leftIndex<=lastIndex){
			int largerIndex=leftIndex;
			if(leftIndex+1<=lastIndex){
				int rightIndex=leftIndex+1;
				if(heap[rightIndex]>heap[leftIndex]){
					largerIndex=rightIndex;
				}
			}
			//Attention! should not use -->heap[root]<heap[largerIndex]<--.
			//I spend time to find the problem....
			if(orphan<heap[largerIndex]){
				heap[rootIndex]=heap[largerIndex];
				rootIndex=largerIndex;
				leftIndex=rootIndex*2+1;
			}else{
				done=true;
			}
		}
		heap[rootIndex]=orphan;
		
	}
	public void swap(int[] a,int i,int j){
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
}

分享到:
评论

相关推荐

    coding-interview-in-java.pdf

    根据提供的文件内容,可以看出这是一个关于Java编程面试题目的集合,涵盖了算法和数据结构在实际编码面试中的应用。下面将详细介绍这些知识点: 1. RemoveDuplicatesfromSortedArray - 在有序数组中删除重复元素,...

    java提高篇(二三)-----HashMap.pdf

    HashMap的主要特点在于通过哈希算法快速定位到存储的位置,允许我们高效地插入、删除和查找元素。 1. **HashMap的定义** HashMap实现了Map接口,并继承了AbstractMap抽象类。Map接口规定了键映射到值的逻辑,而...

    查找最小的k个元素-java版

    输出一组元素中的最小的k个元素。例如数据集为:{1、8、3、6、5、4、7、2},则最小的4个数字为1,2,3和4。 【基本要求】 由随机数产生测试数据,测试数据不小于10000个,测试k的不同取值对算法的影响,如k=10、50、...

    Java高级特性-笔记.pdf

    Collections是Java提供的一个工具类,提供了大量对集合进行操作的静态方法,如sort()用于排序,binarySearch()用于二分查找,max()和min()用于查找最大和最小元素。此外,如果集合中的元素实现了Comparable接口,...

    JAVA算法100例-1.doc

    程序通过循环和判断找到最小的质数k,然后逐步分解n,直到n变为1。这里需要实现一个判断质数的辅助方法,如`iszhishu(int x)`,然后依次找到n的所有质因数并输出。 通过这些题目,你可以练习和掌握以下Java编程和...

    Java实验--找鞍点.docx

    鞍点是指在一个矩阵中,某个元素在所在的行中是最大的,在其所在的列中是最小的。这种练习不仅能够增强学生对Java语言的理解,还能提升他们在数据结构与算法方面的能力。 #### 二、实验内容概述 1. **明确鞍点的...

    剑指Offer-V1.pdf

    20. **最小堆**:最小堆是一种特殊的完全二叉树,常用于实现优先队列,快速找到最小元素。 21-65. 其他章节可能涉及更多的算法和数据结构问题,如矩阵操作、字符串匹配、图的最小生成树、最长公共子序列、约瑟夫环...

    1_example.zip 第k个最小整数

    为了分析和验证这些算法,你可以参考"排序查找最小的第k个数.docx"文档,它可能包含了具体的代码示例和进一步的解释。同时,"example"可能是实现这些算法的一个测试用例或者数据集,用于检查算法的正确性。 总之,...

    程序员笔试面试指导--很不错的一本书电子版

    - A.5 - B.2 - C.4 - D.1 - **答案**: C.4 - **解析**: 对于长度为10的有序数组,最坏情况下需要比较4次才能确定目标值不存在。 ### 测试 12. **单元测试** - **知识点**: 单元测试是对软件中的最小可测试...

    java-leetcode题解之第402题移掉K位数字.zip

    2. 双指针法中,需要维护两个指针,一个`i`用于查找可能的替换元素,另一个`j`用于更新结果。 3. 确保在每次操作后更新K值,并检查K是否已达到0,以判断是否找到解。 4. 注意边界条件,如输入N为0或空字符串,以及K...

    java面试题-leetcode题解之第378题有序矩阵中第K小的元素.zip

    在数据结构中,"第K小的元素"通常指的是在非降序排列的序列中,位置为K的元素,即第K个最小的元素。对于有序矩阵,找到第K小的元素比在无序数组中寻找要高效得多。 ### 3. 解决策略:二分查找 二分查找是一种在有序...

    CLDC API(j2me api)

    它定义了一组最小的Java运行环境,使得这些设备能够运行Java应用程序。CLDC的API旨在保持轻量级,同时提供基本的编程功能,以适应小型设备的内存和处理器限制。 **二、核心组件** CLDC API主要由以下几个核心组件...

    Java实现堆并调整

    堆可以分为最大堆和最小堆,其中最大堆的每个父节点的值都大于或等于其子节点的值,而最小堆则相反。在Java中,我们可以使用数组来表示堆,因为数组天然具有二叉树的形状。在Java中实现堆,我们通常会用到`ArrayList...

    Java排序Java排序.doc

    5. 基数排序:按照元素的每一位数字进行排序,通常用于整数排序,时间复杂度为O(d*(n+k)),d是数字位数,k是基数。 在选择排序方法时,需要考虑以下因素: - 数据规模:对于小规模数据(如n≤50),直接插入排序或...

    java一亿数字取前100个(3秒钟获取)Java算法.zip

    标题中的“java一亿数字取前100个(3秒钟获取)Java算法”涉及到一个经典的计算机科学问题,即在海量数据中快速找到最大的前N个元素。这个问题在大数据处理、排序以及性能优化等领域有着广泛的应用。在这个场景下,...

    蓝桥杯练习系统算法训练习题加答案java版本.pdf

    该题目考查了排序和查找算法,要求使用 Java 语言实现解决方案。 Java 参考代码使用了 BufferedInputStream 读取输入数据,并使用 Arrays.sort() 方法对序列元素进行排序。 ALGO-2 题目:最大最小公倍数 该题目...

    Java寻找第k小

    2. **堆排序法**:可以使用最小堆,先将前k个元素放入堆中,然后逐个添加元素,每次添加后如果堆顶元素不是第k小的,则进行调整。当所有元素都添加完成后,堆顶元素即为第k小的元素。这种方法的时间复杂度为O(nlogk)...

    LeetCode Java Algorithm 记录数据结构与算法训练题,分享java面试题.zip

    - **堆**:可以是最大堆或最小堆,用于实现优先队列,常用于Top K问题、堆排序等。 - **树**:包括二叉树、平衡树(AVL树、红黑树)、B树、B+树等,用于数据索引和查找。 - **图**:用于表示实体间的关系,有邻接...

Global site tag (gtag.js) - Google Analytics