【问题标题】:Quicksorting integer array practice快速排序整数数组练习
【发布时间】:2015-04-27 21:28:54
【问题描述】:

所以我有这个数组{3,1,4,1,5,9,2,6,5,3,5}

我正在使用三中位数的方法来获取枢轴。

所以在这种情况下,这里的中位数在左、中、右之间:3,9,5。所以是 5

我要做的第一件事是确保枢轴在最左边。 现在我将小于 5 的数字保留在左侧,并将更大的数字移到数组的最右侧。最终结果是:{3,1,4,1,2,3|5|5,9,6,5}

现在对左右子数组进行快速排序。

{3,1,4,1,2,3} 的中位数为 3,重新排列后我得到 {1,1,2,3,4}

{5,9,6,5} 的中位数为 5,我得到 {5,5,9,6} 是向右排序相等和更大的数字的结果。但是这个子数组不像第一个子数组那样排序。它只有在中位数为 6 时才有效。那么它哪里出错了?谢谢。

【问题讨论】:

  • 只有当子数组大小为 1 时才完成。不能在任意次数的迭代后停止。
  • 所以你的意思是你必须不断地重新排列数字,左边的值较小,右边的值较大,直到子数组大小变为 1?
  • 是的,您需要对子数组进行递归排序。
  • 最后一件事。在将较小的值放在左侧,将较大的值放在右侧之前,中值/枢轴是否被推到最右边?
  • 是的,这是一种常见的做法(尽管它完全等同于将其推到最左边的位置)。以这种方式对阵列进行分区更容易。如果你把它放在子数组的最右边,你可以用 > 或 >=-section 中的第一个元素来切换它以恢复正确的顺序。

标签: algorithm sorting quicksort


【解决方案1】:

您必须再次对{|5|5,9,6}(或{5|5|,9,6})的右子数组进行排序。中位数为 6,结果将是 {5,6,9}(或 {6,9})。

另请注意,具有许多重复键的简单快速排序可能会降低到二次时间复杂度。有一些方法可以检测与枢轴相等的键并将它们从递归排序的子数组中排除。

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多