【问题标题】:how to convert non-stable sorting to stable algorithm?如何将非稳定排序转换为稳定算法?
【发布时间】:2015-09-13 18:21:19
【问题描述】:

我搜索了太多,但我找不到很好的注释。

建议一种算法使所有非稳定排序算法都像稳定排序算法一样工作?

【问题讨论】:

  • 维基百科条目中有一个排序算法的大表用于排序。它指示哪些是稳定的,哪些是不稳定的。在你对 stackoverflow 提问之前,你有没有想过做一些功课?
  • 假设您正在使用通常是不稳定的排序,一个选项是为数组生成一组从 0 到 n-1 的索引,或者为数组生成一组指针.根据数组对索引或指针进行排序,如果相等,则比较索引或指针保持原来的顺序。
  • 我不仅不是在寻找家庭作业的解决方案,而且我正在给出一些问题作为家庭作业。我想要一些算法而不是任何类型的代码。 @RexD

标签: algorithm sorting


【解决方案1】:

使用额外的内存来存储数组的原始顺序。然后在比较两个相等的元素时在算法中使用该顺序。

这是一个如何使 Python 的 list.sort 稳定的示例:

def make_stable(algorithm):
    def stable_version(A):
        #adding original order of the array
        A2 = [(y, x) for x, y in enumerate(A)]

        #running algorithm in modified array
        algorithm(A2)

        #replacing original array with the result only
        A[:] = [y for y, x in A2]

    return stable_version

A = [3, 2, 1, 2]
stable_sort = make_stable(list.sort)
stable_sort(A)
print A

【讨论】:

  • 我觉得这里有问题!我试图为@Rex 更好地描述它。请阅读
  • 这是一个正确的答案。基本上,您制作 2​​ 元组并对它们进行排序,如果元组的第一个元素相等,则比较第二个元素。毕竟你只是扔掉了第二个元素。
  • Python 的排序正确地对元组进行排序。它也是一种稳定的排序,这是不同的。如果要对元组进行正确排序,可以先按辅助键排序,然后对主键使用稳定排序。如果不是更早的话,这一切都是在 1960 年代解决的。
【解决方案2】:

有稳定排序算法和不稳定排序算法之分。 您应该只选择一个稳定的算法。 Java中的Arrays.sort需要稳定。

【讨论】:

  • 我认为我们可以通过对相等数量进行一些更改来做到这一点。一些变化,例如将非常小的数字添加到相等的数字
猜你喜欢
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多