我正在浏览所有已知/典型的排序算法(插入,冒泡,选择,快速,合并排序......),现在我只读了基数排序。
我想我已经理解了它的概念,但我仍然想知道它是如何在现场完成的?让我解释一下我是如何理解的:
它由两个阶段组成:分区和收集。它们将交替执行。在分区阶段,我们将数据分成每个..让我称之为桶。在收集阶段,我们将再次收集数据。将对要排序的键的每个位置执行两个阶段。所以循环的数量是基于键的大小(如果我们想要排序整数,那么我们更愿意说数字的数量)。
我不想详细解释2个阶段,因为它太长了,我希望你能读到它,因为我不知道如何就地做这个算法..
也许你可以用文字而不是代码来解释?我需要知道我的考试,但我在互联网上找不到任何解释,至少不是一种简单易懂的方式。
如果您想让我解释一下,请告诉我。我会做任何事来理解它。
答案 0 :(得分:2)
维基百科(有时)是你的朋友:https://en.wikipedia.org/wiki/Radix_sort#In-place_MSD_radix_sort_implementations。
我引用了这篇文章:
二进制MSD基数排序,也称为二进制快速排序,可以 通过将输入数组拆分为两个区域来实现就地实现 - 0s bin和1s bin。 0s bin从一开始就生长 数组,而1s bin是从数组的末尾开始生长的。 [...] 。最重要的 检查第一个数组元素的位。如果该位为1,那么 第一个元素与1s bin前面的元素交换 边界(数组的最后一个元素),1s bin生成 通过递减1s边界数组索引来获得一个元素。如果这一点 是0,然后第一个元素保持在其当前位置,并且 0s bin由一个元素生成。 [...] 0s bin和1s bin是 然后根据每个数组元素的下一位递归排序。 递归处理一直持续到最低有效位为止 用于分类。
主要信息是:它是二进制和递归基数排序。换句话说:
每个步骤只有两个桶,比方说0和1。由于算法是“就地”,您可以交换元素(如快速排序),将每个元素放在右侧桶(0或1)中,具体取决于其基数。
递归处理:每个桶分为两个桶,具体取决于下一个基数。
理解无符号整数非常简单:您考虑从最重要到最不重要的位。对于其他数据类型,它可能更复杂(并且过度杀伤)。
总结快速排序算法的差异:
在快速排序中,您选择的一个枢轴定义了两个“桶”:低于枢轴,大于枢轴。
在二进制基数排序中,两个桶由基数定义(例如最高位)。
在这两种情况下,您都交换元素以将每个元素放在其“桶”中并递归处理。