【问题标题】:Making radix sort in-place - trying to understand how使基数就地排序 - 试图了解如何
【发布时间】:2018-01-25 18:14:45
【问题描述】:

我正在学习所有已知/典型的排序算法(插入、冒泡、选择、快速、合并排序......),现在我刚刚阅读了基数排序。

我想我已经理解了它的概念,但我仍然想知道如何就地完成它?让我解释一下我是怎么理解的:

它由 2 个阶段组成:分区和收集。它们将交替执行。在分区阶段,我们将数据分成每个......让我称之为桶。在收集阶段,我们将再次收集数据。将针对要排序的键的每个位置执行这两个阶段。所以循环的数量取决于键的大小(如果我们想要排序整数,我们宁愿说数字的数量)。

我不想详细解释这两个阶段,因为它会太长,我希望你能读到这里,因为我不知道如何就地执行这个算法..

也许你可以用文字而不是代码来解释?我需要在考试中知道它,但我在互联网上找不到任何解释,至少不是以简单易懂的方式。

如果你想让我解释更多,请告诉我。我会做任何事情来理解它。

【问题讨论】:

    标签: algorithm sorting explain radix-sort in-place


    【解决方案1】:

    维基百科(有时)是你的朋友:https://en.wikipedia.org/wiki/Radix_sort#In-place_MSD_radix_sort_implementations

    我引用这篇文章:

    二进制 MSD 基数排序,也称为二进制快速排序,可以 通过将输入数组拆分为两个 bin 就地实现 - 0s bin 和 1s bin。 0s bin 从 数组,而 1s bin 是从数组的末尾增长的。 [...] .最重要的 检查第一个数组元素的位。如果该位为 1,则 第一个元素与 1s bin 前面的元素交换 边界(数组的最后一个元素),并且 1s bin 由 通过递减 1s 边界数组索引来增加一个元素。如果这个位 为 0,则第一个元素保留在其当前位置,并且 0s bin 增长了一个元素。 [...]。 0s bin 和 1s bin 是 然后根据每个数组元素的下一位递归排序。 递归处理继续直到最低有效位 用于排序。

    主要信息是:它是一个binaryrecursive基数排序。换句话说:

    • 对于每个步骤,您只有两个存储桶,比如说 0 和 1。由于算法是“就地”的,因此您可以交换元素(如快速排序)以将每个元素放入正确的存储桶(0 或 1)中,具体取决于其基数。

    • 你递归处理:每个桶被分成两个桶,取决于下一个基数。

    对于无符号整数来说,理解起来非常简单:您考虑从最高有效位到最低有效位的位。对于其他数据类型,它可能会更复杂(并且过度杀伤力)。

    总结一下与快速排序算法的区别:

    • 在快速排序中,您选择的枢轴定义了两个“桶”:低于枢轴,大于枢轴。

    • 在二进制基数排序中,两个桶由基数(例如最高有效位)定义。

    在这两种情况下,您交换元素以将每个元素放入其“桶”中并递归处理。

    【讨论】:

    • 非常感谢 :) 这听起来与快速排序算法非常相似。我明白了,再次谢谢你!
    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2013-05-11
    • 2023-03-28
    相关资源
    最近更新 更多