[英]Counting Sort - Can't understand why my algorithm is not working
在過去的 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)
這一行是一個問題: sortedArray[sumCount[array[i]] - 1] = array[i]
我認為您需要將 array[i] 移一位? 在示例數組 [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
你需要更換
sortedArray[sumCount[array[i]] - 1] = array[i]
sumCount[array[i]] -= 1
經過
sortedArray[sumCount[array[i]-1]-1] = array[i]
sumCount[array[i]-1]-= 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.