使用类似于二进制搜索算法的算法来查找项目所在的位置: a)插入有序列表
if (the item is already in this list)
// output an appropriate message
else
// use the method insertAt to insert the item in the list
我编写方法但不起作用
public int search(int item)
{
int first=0;
int last=length-1;
int mid=-1;
boolean found =false;
while(first<=last && !found){
mid=(first+last)/2;
if(list[mid]==item)
found=true;
else
if(list[mid]-item>0)
last=mid-1;
else
first=mid+1;
}
if(found)
return mid;
else
return -1;
}
public void insert(int item) {
int loc = search(item);
if (loc != -1 && list[loc] != item)
insertAt(loc, item);
else
System.out.println("the item is already existing");
}
答案 0 :(得分:1)
我怀疑您希望您的测试条件为loc == -1 || list[loc] != item
这些条件是(a)找不到您的项目或(b)找到的项目不匹配。条件(b)似乎不应该发生,因为你只是搜索它,但你知道你的代码比我更好。
您可能想要做的一件事是修改搜索以返回项目应插入的位置的倒数,而不是在找不到项目时返回-1。然后你可以做类似的事情:
if (loc < 0) {
insertAt(-loc,item);
}
答案 1 :(得分:0)
试试这个
int[] a = { 1, 2, 3, 5, 6 };
int key = 4;
int p = Arrays.binarySearch(a, key);
if (p >= 0) {
System.out.println("the item is already exiset");
} else {
p = -p - 1;
a = Arrays.copyOf(a, a.length + 1);
System.arraycopy(a, p, a, p + 1, a.length - 1 - p);
a[p] = key;
System.out.println(Arrays.toString(a));
}
输出
[1, 2, 3, 4, 5, 6]
答案 2 :(得分:0)
最好的办法是编辑二进制搜索本身。如果二进制搜索未找到flag
,则会在搜索结束时插入flag
。
public void insert(int item,int[] list, int min, int max) {
if(min>= max){
//insert element at min
}
int mid=(min+max)/2;
if(list[mid]<item){
insert(item, list, mid+1, max)
}
if(list[mid]>item){
insert(item, list, min, mid-1)
}
else{
System.out.println("the item is already existing");
}
}