【问题标题】:Quicksort Pivot快速排序枢轴
【发布时间】:2011-08-31 23:42:29
【问题描述】:

使用快速排序对以下数组 a 进行排序,

[6, 11, 4, 9, 8, 2, 5, 8, 13, 7]

应选择枢轴作为第一个和最后一个元素的算术平均值,即(a[0] + a[size - 1]) / 2 (rounded down)

显示所有重要步骤,例如分区和对算法的递归调用。


我了解如何使用快速排序对数组进行排序,但是我不确定如何计算枢轴。

枢轴是由6 + 7 = 13 然后13 / 2 = 6.5(向下舍入为6)计算的,所以枢轴是2(即第6个元素)?

我知道小于pivot的元素出现在左侧,大于pivot的元素出现在右侧,分区重复这个对子数组排序的步骤。

任何帮助将不胜感激。

【问题讨论】:

    标签: arrays sorting pivot quicksort


    【解决方案1】:

    对于快速排序,枢轴可以是您想要的任何元素。 查看Wikipedia

    通过选择 随机索引 作为枢轴,选择分区的 中间索引 或(特别是对于较长的分区)选择 ,这个问题很容易解决>枢轴分区的第一个、中间和最后一个元素的中位数

    三个选择:

    • 第一个元素
    • 中间元素
    • 第一个、中间和最后一个的中位数。

    在你的情况下,使用第一个和最后一个元素的平均值 value 会给你:

    6 + 7 = 13
    13 / 2 = 6.5
    6.5 rounded down = 6
    

    【讨论】:

    • 我认为这是错误的,但错误出现在原始问题中。你纠正了他们,然后做了他们要求的错误计算,当你取平均值时(第一个,最后一个)。你想要(第一个,中间,最后一个)的中位数。尽管关于教师如何错过选择枢轴点(随机)的更好策略之一的观点很好。
    【解决方案2】:

    对于给定的数组[6, 11, 4, 9, 8, 2, 5, 8, 13, 7]

    计算如下:

    • 选择第一个元素6
    • 选择列表的最后一个元素7

    • 选择中间元素mid = (length%2==0) ? (length/2)-1 : (length-1)/2,即8

    • 这将创建一个数组并对其进行排序,它将为[6,7,8],现在您数组中的中间元素为中间。

    【讨论】:

    • 哇,这是一个 8 年前的问题,直到现在还没有好的答案。我给了你一票,但你的解释很少。
    【解决方案3】:

    顺便提一下问题的措辞,主元应该只是 6,不一定是数组中的第 6 项。

    绝对是这种情况,因为例如,如果数组中只有 3 个项目,并且算术平均值大于 3,那么您将无法选择枢轴,因为没有具有该索引的项目.

    注意:请注意对数组中的元素进行索引的方式。您说第 6 个元素是“2”,如果您的编程语言从 0 开始索引,它可能是“5”。

    【讨论】:

      【解决方案4】:

      您的枢轴是 6。您的枢轴不是第 6 个元素 现在您可以应用以下算法。

      function quicksort(array)
       var list less, greater
       if length(array) ≤ 1
           return array  // an array of zero or one elements is already sorted
       select and remove a pivot value pivot from array
       for each x in array
           if x ≤ pivot then append x to less
           else append x to greater
       return concatenate(quicksort(less), pivot, quicksort(greater))
      

      【讨论】:

        【解决方案5】:

        该计算中枢轴的位置并不重要,快速排序根据元素是大于还是小于枢轴来对元素进行排序。然后将枢轴放置在两组之间(更多和更少)。

        【讨论】:

        • 枢轴元素是否可能不在数组中?
        猜你喜欢
        • 2010-09-14
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多