插入使用二进制搜索排序

Der*_*tle 14 sorting algorithm binary-search insertion-sort

在实现插入排序时,可以使用二进制搜索来定位要插入元素i的数组的第一个i-1元素内的位置.

这将如何影响所需的比较次数?如何使用这样的二进制搜索影响Insertion Sort的渐近运行时间?

我很确定这会减少比较次数,但我不确定为什么.

But*_*ass 19

直接来自维基百科:

如果比较的成本超过交换的成本,例如通过引用或人工交互存储的字符串键(例如选择并排显示的一对中的一个)的情况,则使用二进制插入排序可能会产生更好的性能.二进制插入排序采用二进制搜索来确定插入新元素的正确位置,因此在最坏的情况下执行⌈log2(n)⌉比较,即O(n log n).由于每次插入所需的一系列交换,整个算法的平均运行时间仍为O(n2).

资源:

http://en.wikipedia.org/wiki/Insertion_sort#Variants

这是一个例子:

http://jeffreystedfast.blogspot.com/2007/02/binary-insertion-sort.html

我很确定这会减少比较次数,但我不确定为什么.

好吧,如果你已经知道插入排序和二进制搜索,那么它非常直接.在插入排序中插入一个片段时,必须与之前的所有片段进行比较.假设您要将此[2]移动到正确的位置,在找到正确的位置之前,您必须比较7件.

[1] [3] [3] [3] [4] [4] [5] - > [2] < - [11] [0] [50] [47]

但是,如果你在中间点开始比较(如二进制搜索),那么你只会比较4件!你可以这样做,因为你知道左边的部分已经按顺序排列了(如果部分是有序的话,你只能进行二进制搜索!).

现在想象一下,如果你有成千上万件(甚至数百件),这将为你节省大量时间.我希望这有帮助.| = ^)

  • 它仍然无法解释为什么它实际上是O(n ^ 2),并且维基百科没有引用该句子的来源. (3认同)
  • 如果在链表上应用插入排序,那么最坏情况下的时间复杂度将是 (nlogn) 和 O(n) 最佳情况,这将是相当有效的。 (2认同)

Pat*_*han 6

如果您有一个良好的数据结构来进行有效的二进制搜索,则不太可能有O(log n)插入时间.相反,在任意位置快速插入的良好数据结构不太可能支持二进制搜索.

要实现具有插入排序的最佳比较搜索的O(n log n)性能,需要O(log n)二进制搜索和O(log n)任意插入.

  • 但后来,你刚刚实现堆排序. (8认同)
  • 如果使用平衡二叉树作为数据结构,则两个操作都是O(log n). (5认同)

小智 5

二分插入排序 - 取这个数组 => {4, 5 , 3 , 2, 1}

现在在主循环中,假设我们处于第三个元素。现在使用二分查找,我们将知道在哪里插入 3,即 4 之前。

二分查找使用 O(Logn) 比较,这是一种改进,但我们仍然需要在正确的位置插入 3。为此,我们需要将 3 与 5 交换,然后与 4 交换。

由于插入所需的时间与没有二分查找时的时间相同,最坏情况下的复杂度仍然是 O(n^2)。我希望这有帮助。