【发布时间】:2014-04-03 03:03:22
【问题描述】:
我正在尝试制定一种算法,以找到将 目标 插入已排序数组的最佳位置。
目标是要么返回项目的位置(如果它存在于列表中),否则返回它将进入的位置以保持列表排序。
假设我有一个清单:
0 1 2 3 4 5 6
---------------------------------
| 1 | 2 | 4 | 9 | 10 | 39 | 100 |
---------------------------------
我的目标项目是14
它应该返回5的索引位置
我目前拥有的伪代码:
array = generateSomeArrayOfOrderedNumbers()
number findBestIndex(target, start, end)
mid = abs(end - start) / 2
if (mid < 2)
// Not really sure what to put here
return start + 1 // ??
if (target < array[mid])
// The target belongs on the left side of our list //
return findBestIndex(target, start, mid - 1)
else
// The target belongs on the right side of our list //
return findBestIndex(target, mid + 1, end)
我现在不确定该放什么。我试图对此采取二进制搜索方法,但这是我在 5 次左右重写后能想到的最好的方法。
【问题讨论】:
-
二分搜索是最好的选择——这就是你所需要的。你不需要使用递归,一个简单的
while循环就可以了。 -
如果您检查 array[mid] == 目标,您的递归将大大简化,如果是,则通过返回索引终止。你还需要弄清楚你的基本情况。在递归中,基本情况总是最难的部分。
-
@ldog:这实际上使代码复杂化(额外的
if)。只需将您的基本情况设置为start > end并根据比较递归到[start, mid]或[mid + 1, end]。请记住,我们不想找到target,我们想找到target的successor。 -
@NiklasB.:我认为如果目标存在,我们想返回它的索引。这就是为什么我建议对此进行特殊检查的原因。否则我们可以按照您的建议找到继任者。见林伟的回答,我认为应该是正确的。
-
为什么这个问题被标记为
linked-list?结构是数组还是链表?它是链表,然后二进制搜索将无济于事,因为您需要随机访问才能从二进制搜索中受益,而链表没有。
标签: arrays algorithm sorting linked-list