我正在尝试开发一种比我目前更新的方法,将元素添加到已排序的数组列表中。目前这是我的策略
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);
}
有人可以帮帮我吗?如有必要,我将显示完整的代码
答案 0 :(得分:3)
使用内置的Arrays.binarySearch
实现,而不是开发自己的二进制搜索。但是,就时间而言,这对您的原始版本没有太大的改进。
要了解原因,请考虑将值放在已排序序列中的步骤:
第一步可以在O(log 2 N)中完成。第二步需要O(N)。最后一步需要O(1)。总的来说,插入的时间复杂度是O(log 2 N + N + 1),这与O(N)相同。该算法由第二步支配,因此您可以在将项目向右移动时使用线性搜索。