【问题标题】:sorting a bivalued list对双值列表进行排序
【发布时间】:2012-10-16 22:22:42
【问题描述】:

如果我有一个包含 0 和 1 的二进制值列表,如下面的 000111010110 我想将其排序为以下 000000111111 如果您也知道列表大小,那么最有效的方法是什么?现在我想有一个计数器,当我从头到尾遍历列表时,我只计算 0 的数量。然后,如果我将 listSize 除以 numberOfZeros,我得到 numberOfOnes。然后我在想,不是从零开始重新排序列表,而是创建一个新列表。你同意这是最有效的方法吗?

【问题讨论】:

标签: algorithm list sorting binary


【解决方案1】:

您的算法实现了经典bucket sort 算法的最原始版本(它的counting sort 实现)。当数字的范围已知并且(相对)较小时,这是对数字进行排序的最快方法。由于您只有零和一,因此您不需要存储桶排序中存在的计数器数组:单个计数器就足够了。

【讨论】:

    【解决方案2】:

    如果你有数值,你可以使用汇编指令bitscan(x86汇编中的BSF)来计算位数。要创建“排序”值,您将设置 n+1 位,然后减去 1。这会将所有位设置到 n+1 位的右侧。

    【讨论】:

    • BSF 找到第一个位集的索引。它不计算设置的位数。
    【解决方案3】:

    桶排序看起来是一种排序算法。

    我认为不需要这样的操作。我们知道没有比 N*logN 更快的排序算法。所以默认情况下是错误的。

    所有这一切,因为你要做的就是你在一开始所说的。只需遍历列表并计算零或一,这会给你 O(n) 复杂度。然后只需创建一个新数组在开头计数零,然后是一个。那么你总共有 N+N 复杂度,给你 O(n) 复杂度。

    那只是因为你只有两个值。所以快速排序或任何其他排序都不能更快地做到这一点。没有比 NLog(n) 更快的排序

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2021-08-19
      • 2015-07-08
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多