我聽說過Counting Sort,並根據我的理解編寫了我的版本。計數排序 - 實施差異
public void my_counting_sort(int[] arr)
{
int range = 100;
int[] count = new int[range];
for (int i = 0; i < arr.Length; i++) count[arr[i]]++;
int index = 0;
for (int i = 0; i < count.Length; i++)
{
while (count[i] != 0)
{
arr[index++] = i;
count[i]--;
}
}
}
上面的代碼完美的作品。
但是,在CLRS中給出的算法是不同的。下面是我的實現
public int[] counting_sort(int[] arr)
{
int k = 100;
int[] count = new int[k + 1];
for (int i = 0; i < arr.Length; i++)
count[arr[i]]++;
for (int i = 1; i <= k; i++)
count[i] = count[i] + count[i - 1];
int[] b = new int[arr.Length];
for (int i = arr.Length - 1; i >= 0; i--)
{
b[count[arr[i]]] = arr[i];
count[arr[i]]--;
}
return b;
}
我直接將它從僞代碼翻譯成C#。該代碼不起作用,我得到一個IndexOutOfRange異常。
所以我的問題是:
- 這有什麼錯第二一段代碼?
- 我的幼稚實現和本書給出的算法之間有什麼區別?
你用什麼來輸入'count_sort'的第二個版本?該算法有一些限制,允許輸入值。 – Jacob 2010-09-20 20:31:22
'int [] arr'包含0-100範圍內的整數。我知道如果存在重複的元素,算法將不起作用。 – rohit89 2010-09-20 21:01:56