我偶然发现我的编码问题,我无法看到它出错的地方。
我正在开发一个程序,我需要使用二进制搜索,然后是插入。执行完所有项目后应进行排序,但目前情况并非如此。
我的代码如下:
//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时它给出零,但也许它是相同的排序问题)。如果有人能指出我正确的方向,我将非常感激。
问候,
阿尔弗雷德
答案 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();
}
}
请提供任何错误,差异等反馈。快乐编码!