过去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)
答案 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