我需要帮助来解决这个算法

时间:2012-12-17 15:24:03

标签: java list data-structures

使用类似于二进制搜索算法的算法来查找项目所在的位置: 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");
}

3 个答案:

答案 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");
        }

}