这种排序算法如何运作?

时间:2016-10-10 16:08:13

标签: arrays algorithm sorting recursion

如果你住在加拿大或美国,希望你有美好的一天和感恩节。

所以我有这个问题要求我解释为什么这个排序算法正确排序一个数组。但是我真的不明白这个算法是如何工作的。

考虑以下非常简单和优雅的(?)排序算法:

SomeSort(A,b,e)
if e = b + 1 then
    if A[b] > A[e] then
        exchange A[b] and A[e]
    end if
else if e > b + 1 then
    p ←− [(e-b+1)/3]
    SomeSort(A,b,e − p)
    SomeSort(A,b + p,e)
    SomeSort(A,b,e − p)
end if

(a)解释为什么SomeSort正确地对其输入数组A进行排序,假设n = e - b + 1是 数组的长度(你的论证不一定是一个正式的证明,但应该足够详细 令人信服的)。

(b)找出SomeSort最坏情况运行时间的重现。给出一个紧(即Θ)渐近 受限于SomeSort更糟糕的运行时间(提示:为简单起见,假设某些人的n = 3 k) 常数k)。

(c)通过比较SomeSort与插入排序,合并排序,堆排序和快速排序争论如果这 简单算法是有效的。

所以我从这个算法中理解的是:

第一个if语句检查指针b和e是否在b之前的e的相邻位置,并检查b中的值是否更大。如果是,则交换它们的值。

其他如果在分配数组的长度之前检查e是否在b之前且不与b相邻,则在将它除以3之前将b和e之间的差异分成p。

然后使用新指针进行递归,其中b保持不变,现在是旧e减去旧e和b之间差异的三分之一。

它还会以b为旧b加上旧e和b之间差异的三分之一进行递归。

然后使用与第一次递归相同的指针最后一次递归。

所以我真的不明白为什么它会在e变成e-p时两次递归相同的值。我也不确定如何通过三分之一的差异递归来正确排序数组而不会遗漏任何内容。

如果你能帮助我理解这些递归或者我在这里可能遗失的任何东西,那就太棒了。我甚至无法开始回答这个问题的第二部分,即在不理解算法的情况下找到最坏的情况,所以这真让我烦恼。谢谢!

1 个答案:

答案 0 :(得分:0)

您在排序基本原理中缺少的基本功能是重叠(数组的中间三分之一)与每次传递中遗漏的数量一样大。在最坏的情况下,阵列的三个子集将按相反的顺序排列:" b"第三个属于" e"第三,反之亦然。然而,由于中心部分足够大以容纳所有严重错误的物品,因此三个连续的排序将解决该问题。

使用

浏览算法
  • 一个3元素数组,已按顺序
  • 9个元素的数组,顺序相反
  • 一个7元素阵列,乱码,如[1,4,2,8,5,7,0]

最后,您应该了解算法的工作原理,工作原理以及最佳和最差情况。