基数排序。为什么数组从末尾遍历?

时间:2016-12-30 11:33:19

标签: arrays sorting visual-c++ c++14

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);
}

在计数排序功能中,我不明白为什么从最后遍历计数数组?如果我们从头开始遍历它会有什么不同?

3 个答案:

答案 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]-1count[K]-2

的顺序存储它们

要获取countingsort 稳定的属性(因此它保留了之前调用countingsort所建立的排序),您必须按顺序存储元素wvu,即必须向后遍历数组。

答案 2 :(得分:0)

请尝试输入:[643,613]

使用第二个数字(从右开始)后的数组变为[613,643]

因此,如果要向前移动第三个数字(从右开始) 我们将613放在位置1(因为count []表示结束索引)

底线:数组已经根据前一位进行排序...因此遍历 考虑当前数字时顺序很重要