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

时间:2018-10-29 20:22:03

标签: python algorithm

过去3个小时,我一直在努力建立计数排序算法。我理解这个概念,并且可以使用纸上的计数排序算法对数组进行排序而没有问题。问题是,当尝试将步骤从纸张转换为代码时,我的算法失败了。程序因错误消息“索引超出范围”而中断。为了理解该错误,我使用了打印功能来查看每次迭代的结果。结果不正确。算法有什么问题?

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)

2 个答案:

答案 0 :(得分:0)

这行是个问题:         sortedArray [sumCount [array [i]]-1] = array [i]

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

嵌套列表增加了混乱,并使其更难发现。如果遇到问题,请分解并使用变量,而不要尝试一行执行。调试起来容易得多。您添加打印语句以在每个步骤中打印值,以便您知道哪个列表和索引会导致超出范围的错误

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

答案 1 :(得分:0)

您需要更换

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

作者

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