我如何用java编写这个名为Heap Select的算法?
它应该是这样工作的: 它应该使用两个最小的堆,称为H1和H2。H1是基于输入向量构建的,以后不应修改。H2最初只有一个节点,即H1的基数。在第i次迭代中,对于从1到k-1的i,算法应该提取H2的基数,对应于H1中的席席节点,并且它应该在H2中重新插入H1堆中的XI节点。在k-1迭代之后,H2的基数应对应于输入向量的第k个最小元素 这是我到目前为止所做的,但它不起作用我如何用java编写这个名为Heap Select的算法?,java,algorithm,heap,Java,Algorithm,Heap,它应该是这样工作的: 它应该使用两个最小的堆,称为H1和H2。H1是基于输入向量构建的,以后不应修改。H2最初只有一个节点,即H1的基数。在第i次迭代中,对于从1到k-1的i,算法应该提取H2的基数,对应于H1中的席席节点,并且它应该在H2中重新插入H1堆中的XI节点。在k-1迭代之后,H2的基数应对应于输入向量的第k个最小元素 这是我到目前为止所做的,但它不起作用 public class HeapSelect { public static void main(String args
public class HeapSelect {
public static void main(String args[]) {
List <Integer> intList=new ArrayList<Integer>();
Scanner scanner = new Scanner(System.in);
String[] strNums = null;
if (scanner.hasNextLine()) {
strNums = scanner.nextLine().split(" ");
}
if (strNums != null) {
for (String strNum: strNums) {
try {
intList.add(Integer.parseInt(strNum.trim()));
} catch (Exception e) {
System.out.println("Invalid input");
break;
}
}
}
int[] arr= new int[intList.size()];
int index = 0;
for(int i : intList){
arr[index] = i;
index++;
}
int k = scanner.nextInt();
int n = arr.length;
MinHeap H1 = new MinHeap(n+1);
for (int i=0; i < n; i++) {
H1.insert(arr[i]);
}
H1.minHeap();
MinHeap H2 = new MinHeap(n+1);
H2.insert(H1.Heap[1]);
for (int j=1; j <= k - 1; j++) {
for (int i=j+1; i <= n; i++) {
H2.insert(H1.Heap[i]);
}
H2.remove();
}
System.out.println("result " + H2.remove());
}
公共类HeapSelect{
公共静态void main(字符串args[]){
List intList=new ArrayList();
扫描仪=新的扫描仪(System.in);
字符串[]strNums=null;
if(scanner.hasNextLine()){
strNums=scanner.nextLine().split(“”);
}
if(strNums!=null){
用于(字符串字符串字符串:字符串字符串){
试一试{
add(Integer.parseInt(strNum.trim());
}捕获(例外e){
System.out.println(“无效输入”);
打破
}
}
}
int[]arr=new int[intList.size()];
int指数=0;
for(inti:intList){
arr[index]=i;
索引++;
}
int k=scanner.nextInt();
int n=阵列长度;
MinHeap H1=新的MinHeap(n+1);
对于(int i=0;i 对于(int j=1;j,当您的算法读取时,在最后第四行,您需要从H1中删除,而不是从H2中删除。还需要删除内部循环,将insert语句带到外部循环。否则,您只需添加和删除H1的顶部,而不是超出最小元素的任何地方。最后,为第k个最小int打印H1.remove()
也许你已经解决了这个问题,但是你可以用一个堆来完成。将所有元素插入minheap。要找到k个最小的整数,只需将根整数k次取出到整数数组/列表中。然后报告列表中的所有内容(答案)。如果要恢复堆,只需将列表整数重新插入。O(n)对于堆生成,和k.log(n)来获得结果。如果您想要最大k个元素,请从maxheap开始。“但它不起作用。”它以什么方式不起作用,您测试它的输入是什么?是否有错误(如果有,包括完整堆栈跟踪)?它是否给出错误的输出(如果有,包括预期结果与实际结果)?它是否以其他方式失败(例如无限循环)?请查看并编写a。您的解释和代码毫无意义。这样做的目的只是为了找到输入向量中的第k个最小元素吗?输入如下:(一行上的向量)1 3 7 2 5(以及,在新行上的第k个元素)2.在这个例子中,算法应该输出2显然是的,目的是找到第k个最小元素,但由于这是一个学校项目,我需要通过我解释的步骤得出结果,而不是以与现在不同的方式,它只是显示了一个不正确的结果