Java 在SorterDarrayList中进行二进制搜索

Java 在SorterDarrayList中进行二进制搜索,java,Java,我正在尝试开发一种比目前必须向排序数组列表中添加元素更快的方法。目前这是我的策略 public void insertSorted(E value) { add(value); for (int i = size() - 1; i > 0 && value.compareTo(get(i - 1)) < 0; i--) { this.swap(i); } } 所以我读到,使用二进制搜索算法,我可以更有效地找到最好的方法,更快地

我正在尝试开发一种比目前必须向排序数组列表中添加元素更快的方法。目前这是我的策略

public void insertSorted(E value) {
    add(value);
    for (int i = size() - 1; i > 0 && value.compareTo(get(i - 1)) < 0; i--) {
        this.swap(i);
    }
}
所以我读到,使用二进制搜索算法,我可以更有效地找到最好的方法,更快地放置元素

我试着开发它,但不知为什么它总是输出0

private int binarySearch(E value) {
    int low = 0;
    int high = this.size()-1;

    while (low <= high) {
        int mid = (low + high) / 2;
        E midVal = this.get(mid);
        int cmp = midVal.compareTo(value);

        if (cmp < 0)
            low = mid + 1;
        else if (cmp > 0)
            high = mid - 1;
        else
            return mid;
    }
    return low;
}


public void insertSorted(E value) {
    int searchResult = binarySearch(value);
    add(value, searchResult);
    System.out.println("Value: " + value + ". Position = " + searchResult);

}
private int-binarySearch(E值){
int低=0;
int high=此.size()-1;
while(低0)
高=中-1;
其他的
中途返回;
}
低回报;
}
公共void insertSorted(E值){
int searchResult=binarySearch(值);
添加(值、搜索结果);
System.out.println(“值:“+Value+”.Position=“+searchResult”);
}

有人能帮我吗?如果需要,我将展示完整的代码,而不是开发您自己的二进制搜索,请使用内置实现。然而,在时间方面,这不会给您比原始版本有多大的改进

查看原因,考虑在排序序列中将值放置的步骤:

  • 找到插入位置
  • 将项目移动到插入位置的右侧1
  • 将图元放置到插入位置

第一步可以在O(log2N)中完成。第二步是O(N)。最后一步是O(1)。总的来说,插入的时间复杂度是O(log2N+N+1),与O(N)相同。算法主要由第二步控制,因此在将项目向右移动一步时,您最好使用线性搜索。

您是否覆盖了
hashcode
equals
方法,用于
SorterDarrayList
中的类型?我没有。。。这对我有什么帮助?您在方法中使用了
midVal.compareTo(value)
。你必须给它一个比较规则。我在insertSortedGreat解释中作为参数传入的对象中实现comparable。所以我不会及时得到改善。谢谢你的回答,如果你想要更快的方式,即,O(log n)操作的插入和搜索,考虑使用二进制搜索树(BSTS)。Java中的TreeMap实现了一个BST。我想补充一点:如果您有很多搜索,但插入很少,那么排序数组方法是很好的。如果有许多插入和很少的搜索操作,只需使用未排序的数组并对其进行迭代即可。如果您希望搜索和插入都有O(logn)保证,请使用BST。谢谢@Wickoo,非常感谢:)将对此进行调查
private int binarySearch(E value) {
    int low = 0;
    int high = this.size()-1;

    while (low <= high) {
        int mid = (low + high) / 2;
        E midVal = this.get(mid);
        int cmp = midVal.compareTo(value);

        if (cmp < 0)
            low = mid + 1;
        else if (cmp > 0)
            high = mid - 1;
        else
            return mid;
    }
    return low;
}


public void insertSorted(E value) {
    int searchResult = binarySearch(value);
    add(value, searchResult);
    System.out.println("Value: " + value + ". Position = " + searchResult);

}