二进制搜索和插入

时间:2015-03-17 22:17:03

标签: java arrays sorting insert binary-search

我偶然发现我的编码问题,我无法看到它出错的地方。

我正在开发一个程序,我需要使用二进制搜索,然后是插入。执行完所有项目后应进行排序,但目前情况并非如此。

我的代码如下:

//Array is 103, 102, 101, 105, 106

public int insert(int itemid) {
     int[] newItems = new int[items.length + 1];

itemPos = Arrays.binarySearch(items, 0, itemsLength, itemid);    

    if (itemPos < 0) {
        itemPos = -itemPos - 1;
    }

    System.arraycopy(items, 0, newItems, 0, items.length);
    items = newItems;

    items[itemPos+1] = itemid; 

    itemsLength++;

    System.out.println("item position: " + itemPos);
    System.out.println("item: " + Arrays.toString(items));
    System.out.println("itemslength: " + itemsLength);

    return itemPos;
} 

我运行代码时的输出现在是:

 item position: 0
 item: [103, 102]
 itemslength: 1
 item position: 0
 item: [103, 101, 0]
 itemslength: 2
 item position: 2
 item: [103, 101, 0, 105]
 itemslength: 3
 item position: 3
 item: [103, 101, 0, 105, 106]

我现在唯一的问题是数组没有排序(当它应该是102时它给出零,但也许它是相同的排序问题)。如果有人能指出我正确的方向,我将非常感激。

问候,

阿尔弗雷德

3 个答案:

答案 0 :(得分:0)

您可能想要探索二进制搜索的工作原理。您会发现,为了使其正常工作,要搜索的项目必须进行排序。这就是误导插入位置的原因。

答案 1 :(得分:0)

我假设items开始排序。

当您插入数组的中间时,您需要2 arrayCopy个来复制新位置两侧的项目。

itemPos是应插入新项目的位置,请勿添加+1

答案 2 :(得分:0)

我只是编码的初学者。老实说,无法理解你的代码。但我已经使用二进制搜索编写了一些插入代码。它在插入之前搜索索引,并将元素插入到排序的数组中。希望这可以帮助你!!

public class Insertion {
private int[] a;
int n;
int c;

public Insertion()
{
    a = new int[10];
    n=0;
}

int find(int key)
{
    int lowerbound = 0;
    int upperbound = n-1;

    while(true)
    {
        c = (lowerbound + upperbound)/2;
        if(n==0)
            return 0;
        if(lowerbound>=upperbound)
        {
            if(a[c]<key)
                return c++;
            else
                return c;
        }
        if(a[c]>key && a[c-1]<key)
            return c;
        else if (a[c]<key && a[c+1]>key)
            return c++;
        else
        {
            if(a[c]>key)
                upperbound = c-1;
            else
                lowerbound = c+1;
        }
    }
}

void insert(int key)
{
   find(key);
   for(int k=n;k>c;k--)
   {
       a[k]=a[k-1];
   }
   a[c]=key;
   n++;
}
void display()
{
    for(int i=0;i<10;i++)
    {
        System.out.println(a[i]);
    }
}

public static void main(String[] args)
{
    Insertion i=new Insertion();
    i.insert(56);
    i.insert(1);
    i.insert(78);
    i.insert(3);
    i.insert(4);
    i.insert(200);
    i.insert(6);
    i.insert(7);
    i.insert(1000);
    i.insert(9);
    i.display();
}

}

请提供任何错误,差异等反馈。快乐编码!