【问题标题】:Variation of the counting sort algorithm?计数排序算法的变体?
【发布时间】:2012-03-05 15:36:17
【问题描述】:

我意识到这不是 CLRS 中所述的标准计数排序,但我的简化版本缺少标准计数排序的哪些内容?我意识到我只对正整数进行排序,但这应该很容易调整(通过使用地图)。

def count_sort(array):
    maximum = max(array)
    minimum = min(0, min(array))
    count_array = [0]*(maximum-minimum+1)

    for val in array:
        count_array[val] += 1

    sorted_array = []
    for i in range(minimum, maximum+1):
        if count_array[i] > 0:
            for j in range(0, count_array[i]):
                sorted_array.append(i)

    return sorted_array

array = [3,2,-1,1,5,0,10,18,25,25]
print array
print count_sort(array)

编辑:我之所以认为这不是标准计数排序,是因为 MIT OpenCourseware 讲座中涉及的算法似乎稍微复杂一些(http://youtu.be/0VqawRl3Xzs? t=34m54s)。

【问题讨论】:

  • 是什么让您认为这不是计数排序?这对我来说看起来完全有效。
  • 是的,我也没有发现问题。 FWIW,您甚至不需要映射来处理负数 - 只需创建一个足够大的 count_array 来容纳它们,然后让负索引环绕。
  • 不使用内置max()的特殊原因?
  • 谢谢大家的回答。请参阅上面的编辑,了解为什么我认为这不是标准计数排序。 @RikPoggi - 我是 Python 新手; max(array) 似乎好多了,谢谢!我已经调整了原始代码。
  • 这个答案有一种pythonic方式来删除你的内部for循环(看看结果是如何扩展的:stackoverflow.com/questions/8775963/…

标签: python algorithm sorting


【解决方案1】:

你的意思是http://en.wikipedia.org/wiki/Counting_sort

如果是,它几乎与您的代码相似。但它有一个改进:“这里保留了具有相同键的项目的相对顺序,即这是一种稳定的排序。”。因此,如果您对键值字典进行排序,如果它们具有相同的键,值的顺序将保持不变。

【讨论】:

  • 不,它不稳定。创建的数组不包含初始元素的副本,但它是使用i 索引创建的。
  • 你能解释一下吗?引号中的那句话只是从维基上复制的。我想作者的意思是稳定排序是在具有相同键的项目中保留顺序的排序。可能这个词在这里用的不是很好,但反正从前面的那句就清楚了,是什么意思
  • 嗯,在上面的算法中,整数是排序的。在维基百科上,链接到键的项目是。
  • 是的,当您只对整数进行排序时,这并不重要。但总的来说,当您谈论排序问题时,这意味着所有整数都可以用作键,因此您需要使用键对数据进行排序,而不是单独使用键。现实生活中的排序算法主要用于对字典进行排序,而不仅仅是列表。您还可以阅读排序算法中的稳定性(en.wikipedia.org/wiki/Sorting_algorithm#Stability)。很抱歉提供 wiki 链接,如果您认为 wiki 不够真实 - 您可以在 wiki 页面底部查看链接。
【解决方案2】:

您的最小值和最大值有些奇怪。试试这个:

def count_sort(array):
    maximum = max(array)
    minimum = min(array)
    count_array = [0]*(maximum-minimum+1)

    for val in array:
        count_array[val-minimum] += 1

    sorted_array = []
    for i in range(minimum, maximum+1):
        if count_array[i-minimum] > 0:
            for j in range(0, count_array[i-minimum]):
                sorted_array.append(i)

    print sorted_array

array = [3,2,-1,1,5,0,10,18,25,25]
print array
count_sort(array)

【讨论】:

    【解决方案3】:

    我认为您的计数排序方式没有问题,无论如何,您的代码中的一些建议可能会让您感兴趣。

    例如这一行:

    minimum = min(0, min(array))
    

    可以替换为:

    minimum = min(0, *array)
    

    如果您在 python-2.x 中运行代码,请使用 xrange() 而不是 range(),因此您可以更改:

    for i in range(minimum, maximum+1):
    

    与:

    for i in xrange(minimum, maximum+1):
    

    对于最后一个循环,您实际上根本不需要range(),请查看问题pythonic way to do something N times,以便您进行更改:

    for j in range(0, count_array[i]):
        sorted_array.append(i)
    

    与:

    for _ in itertools.repeat(None, count_array[i]):
        sorted_array.append(i)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多