SortedArrayList中的BinarySearch

时间:2018-03-14 13:58:29

标签: 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 add(E element) {
    ensureCapacity();
    array[size++] = element;
}

所以我读到使用二进制搜索算法我可以更有效地找到更快地放置元素的最佳方法。

我尝试开发它,但不知怎的,它总是输出我。

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);

}

有人可以帮帮我吗?如有必要,我将显示完整的代码

1 个答案:

答案 0 :(得分:3)

使用内置的Arrays.binarySearch实现,而不是开发自己的二进制搜索。但是,就时间而言,这对您的原始版本没有太大的改进。

要了解原因,请考虑将值放在已排序序列中的步骤:

  • 找到插入位置
  • 将项目移动到插入位置右侧一个
  • 将元素置于插入位置

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