簡體   English   中英

計數排序 - 不明白為什么我的算法不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM