Python 计数排序-无法理解为什么我的算法不起作用

Python 计数排序-无法理解为什么我的算法不起作用,python,algorithm,Python,Algorithm,在过去的3个小时里,我一直在努力构建一个计数排序算法。我理解这个概念,我可以在纸上使用计数排序算法对数组进行排序,没有问题。问题是,当试图将纸上的步骤翻译成代码时,我的算法失败了。程序中断,错误消息索引超出范围。为了理解错误,我使用了print函数来查看每次迭代的结果。结果不正确。算法有什么问题 def count_sort(array): minArr = min(array) maxArr = max(array) sumArray = [0 for _ in ra

在过去的3个小时里,我一直在努力构建一个计数排序算法。我理解这个概念,我可以在纸上使用计数排序算法对数组进行排序,没有问题。问题是,当试图将纸上的步骤翻译成代码时,我的算法失败了。程序中断,错误消息索引超出范围。为了理解错误,我使用了print函数来查看每次迭代的结果。结果不正确。算法有什么问题

def count_sort(array):
    minArr = min(array)
    maxArr = max(array)

    sumArray = [0 for _ in range(minArr, maxArr+1)]

    for i in range(len(array)):
        sumArray[array[i] - 1] += 1
    print(sumArray)

    sumCount = []
    sumCount.append(sumArray[0])
    for i in range(1, len(sumArray)):
        sumCount.append(sumArray[i] + sumCount[i-1])
    print(sumCount)

    sortedArray = [0 for _ in range(len(array))]
    for i in range(len(array)):
        sortedArray[sumCount[array[i]] - 1] = array[i]
        sumCount[array[i]] -= 1
    print(sortedArray)
这条线是一个问题: SorterDarray[sumCount[array[i]]-1]=数组[i]

我想你需要把数组[I]调低1?在示例数组[4]=9的最后一次迭代中,它尝试设置sortedArray[sumcount[9]-1]。sumcount的索引从0到8,因此9超出范围。更改为sortedArray[sumcount[array[i]-1]-1]应该可以解决这个问题

嵌套列表增加了混乱,使其更难发现。如果您遇到问题,请将其分解并使用变量,而不是尝试在一行上执行。更容易调试。您可以添加print语句来打印每个步骤的值,以便知道哪个列表和索引导致了越界错误

my_length = len(array)
print(f'for i in range({my_length}):')
for i in range(my_length):
    print(f'x = array[{i}]')
    x = array[i]
    print(f'y = sumCount[{x}] - 1')
    y = sumCount[x] - 1
    print(f'sortedArray[{y}] = {x}')
    sortedArray[y] = x
你需要更换

sortedArray[sumCount[array[i]] - 1] = array[i]
sumCount[array[i]] -= 1


哪一行导致越界?导致越界的值是什么?SorterDarray[sumCount[array[i-1]]-1]=array[i]是行。我试着用数组[1,3,2,9,7]来表示整数,你可以用[0]*lenarray代替[0 for uu in rangelenarray]我不知道。谢谢首先尝试对一个2元素列表进行排序,看看会发生什么。
sortedArray[sumCount[array[i]-1]-1] = array[i]
sumCount[array[i]-1]-= 1