编辑:二进制插入无法正常工作

时间:2018-07-31 15:19:41

标签: java arraylist binary-search non-recursive

仍然是Java的新手;我们的教授希望我们在将ArrayList元素添加时使用非递归二进制搜索。我不断遇到出站异常,而我只是找不到原因。我还注意到调试和逐步操作时的异常行为。对于我的一生,我似乎无法从逻辑上弄清楚这一点。他还希望我们也为此使用compare方法。我的问题是弄清楚为什么/如何使数组越界越好。任何指示和建议将不胜感激.....我们的教授年龄较大,需要DAYS才能通过电子邮件回来,而且我没有那么长的时间来解决这个问题。这是唯一让我无法完成剩余任务的事情。

    public void enqueue(E item) {
    if(arr.size() == 0) {
        arr.add(item);
    }else {
        int low = 0;
        int high = (arr.size());
        while (low <= high){
            int mid = (low + high)>>1;
            if(arrComp.compare(arr.get(mid), item) < 0){
                low = (mid + 1);
            }
            else if (arrComp.compare(arr.get(mid), item) > 0){
                high = (mid - 1);
            }
            else{
                arr.add(mid,item);
            }
        }
    }
}   

***编辑 当我这样做时:

int low = 0;
int high = (arr.size() - 1);
while (low <= high){
    int mid = (low + high) / 2;
    if(arrComp.compare(arr.get(mid), item) < 0){
        low = (mid + 1);
    }
    else if (arrComp.compare(arr.get(mid), item) > 0){
        high = (mid - 1);
    }
    else{
        arr.add(mid,item);
    }
}

}

或者这个:

            if(arr.size() == 0){
                     arr.add(item)
}
            int low = 0;
            int high = (arr.size() - 1);
            while (low <= high){
                int mid = (low + high) / 2;
                if(arrComp.compare(arr.get(mid), item) < 0){
                    low = (mid + 1);
                }
                else if (arrComp.compare(arr.get(mid), item) > 0){
                    high = (mid - 1);
                }
                else{
                    arr.add(mid,item);
                }
            }

    }

都可以运行该方法,但实际上都没有填充arraylist。我不明白为什么这不起作用,从逻辑上讲应该填充数组,否则吗?这次运行没有错误,但实际上什么也没做。数组大小为0,运行后没有元素,但至少现在可以运行。


几乎完全解决了我的问题,但是现在出现了一个新的问题,我无法弄清!!!!

        public void enqueue(E item) {
        int low = 0;
        int high = (arr.size());
        int mid =0;
        int cmp;
        if(arr.size()==0) {
            arr.add(item);
        }/**
        else if(arr.size()==1) {
            cmp = arrComp.compare(arr.get(0), item);
            if(cmp < 0){
                arr.add(item);
            }
            else {
                arr.add(0,item);
            }
        } **/
        else {
            while (low < high){
                mid = (low + high) / 2;
                cmp = arrComp.compare(arr.get(mid), item);
                if(cmp < 0){
                    low = (mid + 1);
                }
                else if (cmp > 0){
                    high = (mid - 1);
                }                   
            }
            arr.add(mid, item);
        }

}

我的循环初始化在其他地方。截至目前,在初始化arraylist时,使用上述enqueue方法,我的输出为{2,3,4,5,6,6,1}。我无法为自己的一生而得到这份订单。授予,我的初始化已经按顺序进行了,但是根据我们的分配,在添加到列表中时,我们必须使用二进制搜索方法对此进行初始化。

为什么第一个初始化项保留在列表的末尾? (1),当所有其他值都添加到它们的正确位置时?是否仅是因为ArrayLists的.add方法添加到列表的末尾,即使它是我要添加的第一个值(如果列表大小当前为0,则使用.add方法)吗?我该如何解决?

我最初的解决方案,即代码的注释部分,除了使输出为{3,4,5,6,1,2}外,什么也没有做,所以我更加困惑了,现在我正在寻求建议。

>

1 个答案:

答案 0 :(得分:2)

 int high = (arr.size());// the why

也许您应该通过以下方式更新代码:

  1. high = arr.size() - 1;
  2. mid = low + (high - low) / 2; //否则,当低点和高点很大时(如果大小很大),它可能会溢出整数;
  3. int cmp = arrComp.compare(arr.get(mid), item); //避免无意义的比较;