Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 如何实现可用于负数的CountingSort?_Python_Algorithm_Data Structures_Counting Sort - Fatal编程技术网

Python 如何实现可用于负数的CountingSort?

Python 如何实现可用于负数的CountingSort?,python,algorithm,data-structures,counting-sort,Python,Algorithm,Data Structures,Counting Sort,我在Python中实现了以下计数排序算法,但它不适用于包含负数的数组。有人能帮我吗 def counting(nlist): nlist = list(nlist) size = len(nlist) if size < 2: return nlist k = max(nlist) counter = [0] * ( k + 1 ) for i in nlist: counter[i] += 1

我在Python中实现了以下计数排序算法,但它不适用于包含负数的数组。有人能帮我吗

def counting(nlist):
    nlist = list(nlist)
    size = len(nlist)

    if size < 2:
        return nlist

    k = max(nlist)

    counter = [0] * ( k + 1 )

    for i in nlist:
        counter[i] += 1

    ndx = 0;
    for i in range( len( counter ) ):
        while 0 < counter[i]:
           nlist[ndx] = i
           ndx += 1
           counter[i] -= 1

   return nlist
def计数(nlist):
nlist=列表(nlist)
大小=长度(nlist)
如果尺寸小于2:
返回列表
k=最大值(nlist)
计数器=[0]*(k+1)
对于nlist中的i:
计数器[i]+=1
ndx=0;
对于范围内的i(len(计数器)):
而0<计数器[i]:
nlist[ndx]=i
ndx+=1
计数器[i]=1
返回列表

一个简单的方法就是找到最小值并将索引偏移该值,这样最小值就存储在
计数器的数组索引0中。然后在while循环中,重新添加最小值以获得原始值:

m = min(nlist)
k = max(nlist) - m

counter = [0] * ( k + 1 )

for i in nlist:
    counter[i-m] += 1

ndx = 0;
for i in range( len( counter ) ):
    while 0 < counter[i]:
       nlist[ndx] = i+m
       ndx += 1
       counter[i] -= 1
m=min(nlist)
k=最大值(nlist)-m
计数器=[0]*(k+1)
对于nlist中的i:
计数器[i-m]+=1
ndx=0;
对于范围内的i(len(计数器)):
而0<计数器[i]:
nlist[ndx]=i+m
ndx+=1
计数器[i]=1

一个简单的方法就是找到最小值并将索引偏移该值,这样最小值就存储在
计数器的数组索引0中。然后在while循环中,重新添加最小值以获得原始值:

m = min(nlist)
k = max(nlist) - m

counter = [0] * ( k + 1 )

for i in nlist:
    counter[i-m] += 1

ndx = 0;
for i in range( len( counter ) ):
    while 0 < counter[i]:
       nlist[ndx] = i+m
       ndx += 1
       counter[i] -= 1
m=min(nlist)
k=最大值(nlist)-m
计数器=[0]*(k+1)
对于nlist中的i:
计数器[i-m]+=1
ndx=0;
对于范围内的i(len(计数器)):
而0<计数器[i]:
nlist[ndx]=i+m
ndx+=1
计数器[i]=1

您可以查找输入中的最低值,并将其一直添加到索引中,在生成输出时将其转换回:

def counting(nlist):
    nlist = list(nlist)
    size = len(nlist)

    if size < 2:
        return nlist

    low = min(nlist)
    k = max(nlist) - low

    counter = [0] * ( k + 1 )

    for i in nlist:
        counter[i - low] += 1

    print(counter) # see what the counter list looks like. Remove in final version 
    ndx = 0;
    for i in range( len( counter ) ):
        while 0 < counter[i]:
            nlist[ndx] = i + low
            ndx += 1
            counter[i] -= 1

    return nlist
def计数(nlist):
nlist=列表(nlist)
大小=长度(nlist)
如果尺寸小于2:
返回列表
低=最小值(nlist)
k=最大值(nlist)-低
计数器=[0]*(k+1)
对于nlist中的i:
计数器[i-低]+=1
打印(计数器)#查看计数器列表的外观。在最终版本中删除
ndx=0;
对于范围内的i(len(计数器)):
而0<计数器[i]:
nlist[ndx]=i+低
ndx+=1
计数器[i]=1
返回列表

您可以查找输入中的最低值,并将其一直添加到索引中,在生成输出时将其转换回:

def counting(nlist):
    nlist = list(nlist)
    size = len(nlist)

    if size < 2:
        return nlist

    low = min(nlist)
    k = max(nlist) - low

    counter = [0] * ( k + 1 )

    for i in nlist:
        counter[i - low] += 1

    print(counter) # see what the counter list looks like. Remove in final version 
    ndx = 0;
    for i in range( len( counter ) ):
        while 0 < counter[i]:
            nlist[ndx] = i + low
            ndx += 1
            counter[i] -= 1

    return nlist
def计数(nlist):
nlist=列表(nlist)
大小=长度(nlist)
如果尺寸小于2:
返回列表
低=最小值(nlist)
k=最大值(nlist)-低
计数器=[0]*(k+1)
对于nlist中的i:
计数器[i-低]+=1
打印(计数器)#查看计数器列表的外观。在最终版本中删除
ndx=0;
对于范围内的i(len(计数器)):
而0<计数器[i]:
nlist[ndx]=i+低
ndx+=1
计数器[i]=1
返回列表

您将while循环缩进了不正确的堆栈,当我粘贴代码时,我没有注意缩进!您已经错误地缩进了while循环,当我粘贴代码时,我没有注意缩进!