void countingsort(int arr[], int n, int exp)
{
int count[10] = {0};
int* output = new int[n];
for (int i = 0; i < n; i++)
count[(arr[i] / exp) % 10]++;
for (int i = 1; i < 10; i++)
count[i] += count[i - 1];
for (int i = n - 1; i >= 0; i--)//Why is array traversed from end?
{
output[count[(arr[i] / exp) % 10] - 1] = arr[i];
count[(arr[i] / exp) % 10]--;
}
for (int i = 0; i < n; i++)
arr[i] = output[i];
}
void radixsort(int arr[], int n)
{
int m = getMax(arr, n);
for (int exp = 1; m / exp > 0; exp *= 10)
countingsort(arr, n, exp);
}
在计数排序功能中,我不明白为什么从最后遍历计数数组?如果我们从头开始遍历它会有什么不同?
答案 0 :(得分:0)
数组被向后遍历,因为计数被转换为结束索引。将计数转换为起始索引并向前遍历数组的示例:
void countingsort(int arr[], int n, int exp)
{
int count[10] = {0};
int* output = new int[n];
for (int i = 0; i < n; i++)
count[(arr[i] / exp) % 10]++;
int sum = 0, tmp; // convert counts to starting indices
for (int i = 0; i < 10; i++){
tmp = count[i];
count[i] = sum;
sum += tmp;
}
for (int i = 0; i < n ; i++) // traverse from beginning
{
output[count[(arr[i] / exp) % 10]] = arr[i];
count[(arr[i] / exp) % 10]++; // -- => ++
}
for (int i = 0; i < n; i++)
arr[i] = output[i];
delete[] output;
}
答案 1 :(得分:0)
说,对于特定的密钥K
,您可以将其发生在
..., u, ..., v, ..., w, ...
计数后,确定这些元素到达位置
..., count[K]-2, count[K]-1, count[K], ...
然后按照count[K]
,count[K]-1
,count[K]-2
要获取countingsort
稳定的属性(因此它保留了之前调用countingsort
所建立的排序),您必须按顺序存储元素w
,v
,u
,即必须向后遍历数组。
答案 2 :(得分:0)
请尝试输入:[643,613]
使用第二个数字(从右开始)后的数组变为[613,643]
因此,如果要向前移动第三个数字(从右开始) 我们将613放在位置1(因为count []表示结束索引)
底线:数组已经根据前一位进行排序...因此遍历 考虑当前数字时顺序很重要