Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python基数排序_Python_Radix Sort - Fatal编程技术网

Python基数排序

Python基数排序,python,radix-sort,Python,Radix Sort,我试图在python中实现基数排序 我当前的程序无法正常工作,因为像[41,51,2,3123]这样的列表将正确排序为[2,3,41,51123],但像[52,41,51,42,23]这样的列表将变成[23,41,42,52,51](52和51位于错误的位置) 我想我知道为什么会发生这种情况,因为当我比较十位的数字时,我也不会比较单位(10的高次幂也是如此) 我如何解决这个问题,使我的程序以最快的方式运行?谢谢 def radixsort(aList): BASEMOD = 10

我试图在python中实现基数排序

我当前的程序无法正常工作,因为像[41,51,2,3123]这样的列表将正确排序为[2,3,41,51123],但像[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]))

当前,排序不会根据值的最高位数以外的任何内容对值进行重新排序。只有在偶然的情况下,您才能正确获得
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
def基数排序(nums,基数=10):
结果_列表=[]
功率=0
而NUM:
范围内(基本)的料仓=[]
对于NUM中的x:
箱[x//base**power%base]。追加(x)
nums=[]
对于垃圾箱中的垃圾箱:
对于箱子中的x:
如果x

注意,基数排序不一定比基于比较的排序快。只有当要排序的项目数大于项目值的范围时,它才具有较低的复杂性。它的复杂性是
O(len(nums)*log(max(nums))
,而不是
O(len(nums)*log(len(nums))

基数排序通过首先将相同位置值的各个数字分组来对元素进行排序。[2,3,41,51123]首先,我们根据第一个数字对它们进行分组

[[],[41,51],[2],[3,123],[],[],[],[],[],[]]
然后,根据元素的递增/递减顺序对元素进行排序。新阵列将被删除

[41,51,2,3,123]
    [2,3,123,41,51] 
然后我们将根据第十位进行排序。在这种情况下[2,3]=[02,03]

[[2,3],[],[123],[],[41],[51],[],[],[],[]]
现在,新的阵列将

[41,51,2,3,123]
    [2,3,123,41,51] 
最后以第100位为基础。这次[2,3,41,51]=[002003041051]

  [[2,3,41,51],[123],[],[],[],[],[],[],[],[]]
最后我们得到了[2,3,41,51123]

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
            

如果你关心速度,你就不会创建自己的排序。我正在尝试做我能做的最快的排序基本上,我不希望它是O(n^2)或什么只是为了澄清,你意识到你不会得到比内置排序更快的排序,对吧?是的,我不是一个坚持速度的人,但我希望这是一个基数程序的正常时间。