查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
我的思路:利用二叉堆,构建一个容量为k的定长最小二叉堆,遍历数组,逐个将元素add进堆,完毕返回堆中所有元素即为最小的k个元素
package org.jf.alg;
/**
* 定长小根堆
* 数组存储,数组第一个元素留空
*
* 第k个元素的左儿子为 a[2k],右儿子为a[2k+1]
*
* 第k个元素的父节点为a[k/2]
*
* k从1记起
*
* @author chenjf
*
*
*/
public class LittleHeadFixedBinHeap<T extends Comparable>
{
private Object array[];
private int current_size = 0;
/**
*
* @param size 堆大小
*/
public LittleHeadFixedBinHeap(int size)
{
array = new Object[size+1];
}
public LittleHeadFixedBinHeap(int size,T []data_array)
{
array = new Object[size+1];
for(int i=0;i<data_array.length;i++)
{
this.add(data_array[i]);
}
}
/**
* 往堆中添加一个元素
*
*分两种情况:
*1.当前堆未满,直接添加到末尾,回溯保持堆性质
*2.当前堆已满,则找出最后一层中最大元素并与当前元素比较,若当前元素小,则替换,否则什么也不做
*
* @param data
*/
public void add(T data)
{
int comp_begin = current_size/2+1;//求最大值的起始位置
int indx = 1;//记录当前新插入的元素索引
if(current_size<array.length-1)//堆未满 直接将新元素插入末尾
{
array[++current_size]=data;
indx = current_size;
}
else//堆已满 查找最后一层中的最大值
{
int max_indx = comp_begin;
T max = (T) array[max_indx];
int i=comp_begin;
while(i<array.length)
{
if(max.compareTo((T)array[i])<0)
{
max_indx = i;
max = (T) array[max_indx];
}
i++;
}
if(max.compareTo(data)>0)
{
indx = max_indx;
array[indx] = data;//当前的最大值被删除了
}
else
{
indx = 1;//不替换
}
}
//向上检测
while(indx>1)
{
//当前元素与其父节点比较 若小,则交换 indx = indx/2
//否则 break
int pdx = indx/2;
if(((T)array[indx]).compareTo(((T)array[pdx]))<0)
{
Object tmp = array[indx];
array[indx] = array[pdx];
array[pdx]=tmp;
indx = pdx;
}else
{
break;
}
}
}
/**
* 删除堆顶元素
* 删除堆顶,用最后一个元素代替堆顶,向下检测保持堆性质
*
* @return
*/
public T remove()
{
T data = null;
if(current_size==0)
return null;
data = (T) array[1];
array[1] = array[current_size];
array[current_size] = null;
current_size -- ;
//根节点与左右子节点中最小元素交换
int indx = 1;
int min_indx =indx;
Object tmp = null;
while((min_indx=getMinIndx(indx))!=indx)
{
//indx 与 min_indx元素交换
tmp = array[indx];
array[indx]=array[min_indx];
array[min_indx]=tmp;
indx = min_indx;
}
return data;
}
private int getMinIndx(int indx)
{
T left = null;
T right = null;
if(indx*2>this.current_size)//没有子节点
return indx;
if(indx*2==this.current_size)
left = (T)array[indx*2];
else
{
left = (T)array[indx*2];
right =(T)array[indx*2+1];
}
if(right==null)
{
if(left.compareTo((T)array[indx])<0)
indx = indx*2;
}else
{
if(left.compareTo((T)array[indx])<0)
{
indx = indx*2;
if(right.compareTo((T)array[indx])<0)
indx = indx+1;
}
else if(right.compareTo((T)array[indx])<0)
{
indx = indx*2+1;
}
}
return indx;
}
public T peek()
{
if(this.current_size>0)
return (T) array[1];
return null;
}
public int capacity()
{
return array.length-1;
}
void printArray()
{
for(int i=1;i<=this.current_size;i++)
{
System.out.print(array[i].toString()+" ");
}
System.out.println("\n");
}
public Object [] getAll()
{
Object[] newArray = new Object[this.current_size];
System.arraycopy(array, 1, newArray, 0, current_size);
return newArray;
}
public static void main(String args[])
{
Integer array[] = new Integer[]{3,5,2,6,7,-1,8,0,9,-10};
LittleHeadFixedBinHeap heap = new LittleHeadFixedBinHeap(5,array);
heap.printArray();
}
}
分享到:
相关推荐
输入一个N位高精度的正整数,去掉其中任意K个数字后剩下的数字...写算法对给定的N和K,寻找一种方案使得剩下的数字组成的新数最小。 输入:N、K以及一个N位高精度的正整数 输出:剩下的数字组成的最小新数 如下图所示:
删数问题 Description 给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个 新的正整数。对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数 最小的删数方案。 «...
在N个数字中,删除K个,使剩余的数字最小。
最小的k个数.md
js代码-最小k个数
试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数方案。 输入格式 可输入多组测试数据(不超过50组测试数据),每组测试数据分两行,每行一个数,数的含义如下。 第一行:正整数a(a是大于0的一个n...
本文实例讲述了Python实现查找最小的k个数。分享给大家供大家参考,具体如下: 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 解法1 使用partition...
问题描述: 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。 算法设计: 给定n (1)位的正整数a和k,...试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数方案。
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 这个题目完成的思路有很多,很多排序算法都可以完成既定操作,关键是复杂度性的考虑。以下几种思路当是笔者...
第三行输入一个正整数k,表示求该组测试例中的前k个最小元素。(设给出的每个整数序列中的元素是唯一的。) 输出:对于每个测试例输出一行,由k个整数组成,表示输入的n个整数中前k个最小元素。整数之间用一个空格隔...
问题描述: 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。 算法设计: 给定n (1)位的正整数a和k,...试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数方案。
java基础面试题最小的K个数提取方式是百度网盘分享地址
这是一个用C++写的简单算法,里面没用到什么高深的东西,就是基本的控制语句组成。
例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4。示例 1:输出:[1,2] 或者 [2,1]示例 2:输出:
使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。) 编程任务: 对于给定的k个待安排的活动,编程计算使用最少会场的时间表。 Input 输入数据是由多组测试数据组成。每组测试数据输入的第一行有1 个...
在一堆数中取出前K个最大最小的数的方法。这个是我们平时经常用到的排序问题,也是IT考试几乎必考的。多看看方法,还是有帮助的。
python求最大公约数和最小公倍数 #辗转相除法 def gcd(a,b): #最大公约数函数,且最小公倍数 = 两个数相乘 / 最大公约数 if b == 0: return a else: return gcd(b,a%b) print("请输入两个数:") j,k = input()....
用C语言利用数组来模拟实现一个堆的结构