2013-08-26 71 views
2

我有一個關於這個算法中的問題:基數排序的代碼混淆

enter image description here

(幻燈片採取from here.

int N = a.length; 
int[] count = new int[R]; 
for (int i = 0; i < N; i++) 
count[a[i]+1]++; 
for (int k = 1; k < 256; k++) 
count[k] += count[k-1]; 
for (int i = 0; i < N; i++) 
temp[count[a[i]++]] = a[i] 
for (int i = 0; i < N; i++) 
a[i] = temp[i]; 

有人能闡述關於第三for循環,我們從移動記錄a []到temp []?

我知道,在我們積累計數後,他們應該是某種抵消。所以我們可以在temp []中的適當位置插入字母。

我只是不確定[i] ++在做什麼。(< -main question)我知道在count數組中引用這個字母的地方,但是爲什麼我們也要增加這個字母?我們換了信嗎?謝謝。

感謝您的幫助。

回答

1

它看起來像一個錯字: 應該是:

temp[count[a[i]]++] 

下一個元素應該進入下一個空的空間

在步驟1中

準備增加type_i計數cnt_{i+1},這樣一來使得空間for type_i elements ...

step2是計數前綴

步驟3使用計數作爲R索引指針並將從a所有元素到它的最終目的地

不變holded者在此步驟:

  • count[ x ]指向下一個空的空間,其中一個type_x元件可以被放置(或輸入中沒有x元素)
+0

因爲當我們在第一個for循環中計數[a [i] +1] ++時,我們將type_i + 1的頻率正確地增加了嗎? 在幻燈片上它應該是a = 0,b = 2,c = 5 ...對嗎? – bunnybare

+0

幻燈片顯示在step1之後'step3' –

+0

後的系統狀態,它應該是:a = 0,b = 2,c = 3,... –