【问题标题】:Using a binary search algorithm as a basis to implement a binary insert以二分查找算法为基础实现二分插入
【发布时间】:2012-08-31 07:47:23
【问题描述】:

我正在尝试实现二进制插入方法。

目前这个方法很简单,它接受一个参数,在一个while循环中它搜索一个比参数大的元素(在这种情况下是一个人的姓氏的字符串),一旦它中断找到它并将数组的其余部分向右移动。然后将参数插入到break的位置。

我尝试将其更改为通过借用二进制搜索算法来搜索插入位置的方法。但是,我就是无法让它工作。

你能告诉我我做错了什么吗?这是我的代码:

公共无效插入(个人) { String lastName = person.getLastName(); int position = -1; // the position from which the array will be shifted to the right and where the argument will be inserted, will be assigned properly below int lowerBound = 0; int upperBound = numElems - 1; int currIt; if (numElems == 0) array[0] = person; // if array empty insert at first position else { while (true) { currIt = (lowerBound + upperBound) / 2; //the item to compare with int result2 = 0; int result1 = array[currIt].getLastName().compareTo(lastName); if (array[currIt+1] != null) // if the next element is not null, compare the argument to it result2 = array[currIt+1].getLastName().compareTo(lastName); if (currIt == 0 && result1 > 0) // this is when the argument is smaller then the first array element { position = 0; break; } // if the position to insert is the last one, or we have found a suitable position between a smaller and a bigger element else if ( (result1 < 0 && (currIt == numElems-1)) || (result1 < 0 && result2 > 0) ) { position = currIt+1; break; } else { if (result1 < 0) // the place to put it should be in the upper half lowerBound = currIt + 1; else upperBound = currIt - 1; //in the lower half } } } // position has been set to anything else other -1, then we have found our spot, probably a redundant check but useful for debugging if (position != -1) { //shift array to the right and insert element for (int j = numElems; j > position; j--) array[j] = array[j-1]; System.out.println("Inserted an element"); array[position] = person; numElems++; } }

【问题讨论】:

  • 你能提供一个最简单的例子来说明你的问题吗?
  • 如果说我们有以下内容:arr.insert(new Person("Charles", "Dickens", 23));arr.insert(new Person("Adam", "Bay", 29)); arr.insert(new Person("Ethan", "Fowler", 18)); 我希望按姓氏排列它们(“Bay”...);这很好用:String lastName = person.getLastName(); int i; for (i = 0; i &lt; numElems; i++) if (array[i].getLastName().compareTo(lastName) &gt; 0) break; for (int j = numElems; j &gt; i; j--) array[j] = array[j-1]; array[i] = person; numElems++; 但想加快速度:)

标签: java arrays insert binary sorted


【解决方案1】:

您的“可能 [] 冗余检查”禁止初始插入。位置第一次是-1。

在顶部将position 设置为0,应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多