偏二分排序 Return 第一个插入索引

Biased Binary Sort Return First Index of Insertion

我正在尝试返回第一个可能的位置,在这个位置我可以在不断增加的列表中插入新术语。我的一般尝试是使用二进制排序,直到出现以下条件:前一项小于我的插入项,而下一项等于或大于我的插入项:

lis = [1,1,2,2,2,4,5,6,7,8,9]

def binary_sort(elem, lis, left, right):

    mid = (left + right)//2
    if (lis[mid-1] < elem and elem <= lis[mid]):
        return mid
    elif (lis[mid] > mid):
        return binary_sort(elem, lis, mid, right)
    else:
        return binary_sort(elem, lis, left, mid)

这不起作用...我的代码或我的一般策略哪里有问题?

我建议看一下下面的代码。

def binary_insertion_search(elem, items, left, right):
    if elem > items[right]:
        return right + 1
    while left < right:
        mid = (left + right) // 2
        if elem > items[mid]:
            left = mid + 1
        elif elem <= items[mid]:
            right = mid
    return left

我稍微重写了你的函数。现在进行解释:

我假设 return 的索引是可以放置任何内容的第一个位置,这反过来会将所有后续项目移到右侧。

由于我们无法按设计合并列表范围之外的索引,因此我们必须检查元素是否大于列表末尾的项目。然后我们 return 下一个可能的索引 len(lis).

为了完全避免递归,我使用了 while 循环。首先,我们检查 left 是否等于或大于 right。这只有在我们找到放置元素的索引时才是正确的。

你的 mid 值计算得很好,所以我就保留了它。

如果我们的元素大于 mid 处的项目,唯一可能的下一个选项是 select 下一个 未选中的位置 ,即 mid + 1.

现在进入有趣的部分。与另一种情况一样,要找到最左边的项目,我们必须将 right 边界设置为 mid - 1,以便跳过 mid 元素。但是,我们检查元素是否小于 或等于 mid 处的项目。 这向我们保证,当我们找到等于搜索元素的候选者时,我们 运行 再次搜索(从右开始减少范围)以可能找到更小的索引。当 left == right 为真时,循环结束。

我希望这能回答您的问题并指出代码中的差异!