我正在尝试在python中实现Radix排序。
我当前的程序工作不正常,因为像[41,51,2,3,123]这样的列表会正确排序到[2,3,41,51,123],但类似于[52,41,51,42] ,23]将成为[23,41,42,52,51](52和51在错误的地方)。
我想我知道为什么会发生这种情况,因为当我比较数十位的数字时,我也不比较单位(对于10的更高权力也是如此)。
如何解决此问题,以便我的程序以最快的方式运行?谢谢!
def radixsort(aList):
BASEMOD = 10
terminateLoop = False
temp = 0
power = 0
newList = []
while not terminateLoop:
terminateLoop = True
tempnums = [[] for x in range(BASEMOD)]
for x in aList:
temp = int(x / (BASEMOD ** power))
tempnums[temp % BASEMOD].append(x)
if terminateLoop:
terminateLoop = False
for y in tempnums:
for x in range(len(y)):
if int(y[x] / (BASEMOD ** (power+1))) == 0:
newList.append(y[x])
aList.remove(y[x])
power += 1
return newList
print(radixsort([1,4,1,5,5,6,12,52,1,5,51,2,21,415,12,51,2,51,2]))
答案 0 :(得分:1)
基数排序通过首先将同一位值的各个数字分组来对元素进行排序。 [2,3,41,51,123] 首先我们根据第一位数字对它们进行分组。
[[],[41,51],[2],[3,123],[],[],[],[],[],[]]
然后,根据元素的递增/递减顺序对元素进行排序。新数组将是
[41,51,2,3,123]
然后我们将根据第十位数字进行排序。在这种情况下 [2,3]=[02,03]
[[2,3],[],[123],[],[41],[51],[],[],[],[]]
现在新数组将是
[2,3,123,41,51]
最后基于第 100 位数字。这次 [2,3,41,51]=[002,003,041,051]
[[2,3,41,51],[123],[],[],[],[],[],[],[],[]]
最后我们得到了 [2,3,41,51,123]
def radixsort(A):
if not isinstance(A,list):
raise TypeError('')
n=len(A)
maxelement=max(A)
digits=len(str(maxelement)) # how many digits in the maxelement
l=[]
bins=[l]*10 # [[],[],.........[]] 10 bins
for i in range(digits):
for j in range(n): #withing this we traverse unsorted array
e=int((A[j]/pow(10,i))%10)
if len(bins[e])>0:
bins[e].append(A[j]) #adds item to the end
else:
bins[e]=[A[j]]
k=0 # used for the index of resorted arrayA
for x in range(10):#we traverse the bins and sort the array
if len(bins[x])>0:
for y in range(len(bins[x])):
A[k]=bins[x].pop(0) #remove element from the beginning
k=k+1
答案 1 :(得分:0)
目前,您的排序不会根据除最高位数之外的任何值重新排序值。您只能偶然获得41
和42
权利(因为它们在初始列表中的顺序相对正确)。
您应始终根据排序的每个周期构建新列表。
def radix_sort(nums, base=10):
result_list = []
power = 0
while nums:
bins = [[] for _ in range(base)]
for x in nums:
bins[x // base**power % base].append(x)
nums = []
for bin in bins:
for x in bin:
if x < base**(power+1):
result_list.append(x)
else:
nums.append(x)
power += 1
return result_list
请注意,基数排序不一定比基于比较的排序更快。如果要排序的项目数量大于项目值的范围,则其复杂度较低。它的复杂性为O(len(nums) * log(max(nums)))
而不是O(len(nums) * log(len(nums)))
。