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;
}
}
分享到:
相关推荐
根据提供的文件内容,可以看出这是一个关于Java编程面试题目的集合,涵盖了算法和数据结构在实际编码面试中的应用。下面将详细介绍这些知识点: 1. RemoveDuplicatesfromSortedArray - 在有序数组中删除重复元素,...
HashMap的主要特点在于通过哈希算法快速定位到存储的位置,允许我们高效地插入、删除和查找元素。 1. **HashMap的定义** HashMap实现了Map接口,并继承了AbstractMap抽象类。Map接口规定了键映射到值的逻辑,而...
输出一组元素中的最小的k个元素。例如数据集为:{1、8、3、6、5、4、7、2},则最小的4个数字为1,2,3和4。 【基本要求】 由随机数产生测试数据,测试数据不小于10000个,测试k的不同取值对算法的影响,如k=10、50、...
Collections是Java提供的一个工具类,提供了大量对集合进行操作的静态方法,如sort()用于排序,binarySearch()用于二分查找,max()和min()用于查找最大和最小元素。此外,如果集合中的元素实现了Comparable接口,...
程序通过循环和判断找到最小的质数k,然后逐步分解n,直到n变为1。这里需要实现一个判断质数的辅助方法,如`iszhishu(int x)`,然后依次找到n的所有质因数并输出。 通过这些题目,你可以练习和掌握以下Java编程和...
鞍点是指在一个矩阵中,某个元素在所在的行中是最大的,在其所在的列中是最小的。这种练习不仅能够增强学生对Java语言的理解,还能提升他们在数据结构与算法方面的能力。 #### 二、实验内容概述 1. **明确鞍点的...
20. **最小堆**:最小堆是一种特殊的完全二叉树,常用于实现优先队列,快速找到最小元素。 21-65. 其他章节可能涉及更多的算法和数据结构问题,如矩阵操作、字符串匹配、图的最小生成树、最长公共子序列、约瑟夫环...
为了分析和验证这些算法,你可以参考"排序查找最小的第k个数.docx"文档,它可能包含了具体的代码示例和进一步的解释。同时,"example"可能是实现这些算法的一个测试用例或者数据集,用于检查算法的正确性。 总之,...
- A.5 - B.2 - C.4 - D.1 - **答案**: C.4 - **解析**: 对于长度为10的有序数组,最坏情况下需要比较4次才能确定目标值不存在。 ### 测试 12. **单元测试** - **知识点**: 单元测试是对软件中的最小可测试...
2. 双指针法中,需要维护两个指针,一个`i`用于查找可能的替换元素,另一个`j`用于更新结果。 3. 确保在每次操作后更新K值,并检查K是否已达到0,以判断是否找到解。 4. 注意边界条件,如输入N为0或空字符串,以及K...
在数据结构中,"第K小的元素"通常指的是在非降序排列的序列中,位置为K的元素,即第K个最小的元素。对于有序矩阵,找到第K小的元素比在无序数组中寻找要高效得多。 ### 3. 解决策略:二分查找 二分查找是一种在有序...
它定义了一组最小的Java运行环境,使得这些设备能够运行Java应用程序。CLDC的API旨在保持轻量级,同时提供基本的编程功能,以适应小型设备的内存和处理器限制。 **二、核心组件** CLDC API主要由以下几个核心组件...
堆可以分为最大堆和最小堆,其中最大堆的每个父节点的值都大于或等于其子节点的值,而最小堆则相反。在Java中,我们可以使用数组来表示堆,因为数组天然具有二叉树的形状。在Java中实现堆,我们通常会用到`ArrayList...
5. 基数排序:按照元素的每一位数字进行排序,通常用于整数排序,时间复杂度为O(d*(n+k)),d是数字位数,k是基数。 在选择排序方法时,需要考虑以下因素: - 数据规模:对于小规模数据(如n≤50),直接插入排序或...
标题中的“java一亿数字取前100个(3秒钟获取)Java算法”涉及到一个经典的计算机科学问题,即在海量数据中快速找到最大的前N个元素。这个问题在大数据处理、排序以及性能优化等领域有着广泛的应用。在这个场景下,...
该题目考查了排序和查找算法,要求使用 Java 语言实现解决方案。 Java 参考代码使用了 BufferedInputStream 读取输入数据,并使用 Arrays.sort() 方法对序列元素进行排序。 ALGO-2 题目:最大最小公倍数 该题目...
2. **堆排序法**:可以使用最小堆,先将前k个元素放入堆中,然后逐个添加元素,每次添加后如果堆顶元素不是第k小的,则进行调整。当所有元素都添加完成后,堆顶元素即为第k小的元素。这种方法的时间复杂度为O(nlogk)...
- **堆**:可以是最大堆或最小堆,用于实现优先队列,常用于Top K问题、堆排序等。 - **树**:包括二叉树、平衡树(AVL树、红黑树)、B树、B+树等,用于数据索引和查找。 - **图**:用于表示实体间的关系,有邻接...