【问题标题】:Utilizing radix sort to sort both negative and positive numbers [duplicate]利用基数排序对负数和正数进行排序[重复]
【发布时间】:2016-05-25 13:02:10
【问题描述】:

我正在尝试使用基数排序来对无序整数列表进行排序,包括正数和负数。我有能力对正数列表进行排序,但我对如何使用基数排序和负数感到困惑。我想知道是否有人可以帮助我编写代码并解释有关基数排序如何处理负数的部分。经过一番谷歌搜索后,我了解到您必须将负号视为特殊字符,但我仍在困惑的火车上。下面你可以看到我目前对基数排序的实现,取自https://gist.github.com/rizkyabdilah/1740053

def radix_sort(random_list):
len_random_list = len(random_list)
modulus = 10
div = 1
while True:
    # empty array, [[] for i in range(10)]
    new_list = [[], [], [], [], [], [], [], [], [], []]
    for value in random_list:
        least_digit = value % modulus
        least_digit /= div
        new_list[least_digit].append(value)
    modulus = modulus * 10
    div = div * 10

    if len(new_list[0]) == len_random_list:
        return new_list[0]

    random_list = []
    rd_list_append = random_list.append
    for x in new_list:
        for y in x:
            rd_list_append(y)

random_data = [13, 8, 1992, 31, 3, 1993, 1, 0, -1]
print radix_sort(random_data)

感谢您的帮助!

【问题讨论】:

  • 是的,这就是我想弄清楚特殊字符的方法,但我不知道如何编码......
  • 正如上面链接中提到的,您可以将初始列表拆分为两个列表:负整数和正整数。分别对这些列表进行排序,然后将它们连接在一起。要对负整数进行排序,只需将它们设为正数,使用基数排序对它们进行排序,反转结果并再次将它们设为负数。
  • 正如 Edgar Rokyan 所说,在stackoverflow.com/questions/15306665/… 我已经发布了一个最佳答案。继续进行位移和按位与。使用基数 256 或 65536 而不是任意半径。

标签: python algorithm sorting negative-number radix-sort


【解决方案1】:

最简单的方法是补充最高有效字段的符号位,用于计数(直方图)生成和基数排序期间的索引。假设数据接近随机,由于随机写入,该进程的内存带宽有限,因此补符号位的开销不会对整体性能产生太大影响。

这是假设一个或两个补数整数。

如果我没记错的话,符号 + 幅度,这是 IEEE 浮点值的有效实现方式(如果基数将它们排序为整数),需要对正数的符号位进行补码,对整数求反负数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多