我如何用java编写这个名为Heap Select的算法?

我如何用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

它应该是这样工作的:

它应该使用两个最小的堆,称为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[]) { 

    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个最小元素,但由于这是一个学校项目,我需要通过我解释的步骤得出结果,而不是以与现在不同的方式,它只是显示了一个不正确的结果