【发布时间】: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