基数排序:降序

时间:2015-11-11 18:09:52

标签: c sorting radix

这是我的RadixSort功能(升序):

void RadixSort (int a[], int n)
{
    int i, m=0, exp=1, b[MAX];
    for (i=0; i<n; i++)
    {
        if (a[i]>m)
            m=a[i];
    }
    while (m/exp>0)
    {
        int bucket[10]={0};
        for (i=0; i<n; i++)
            bucket[a[i]/exp%10]++;
        for (i=1; i<10; i++)
            bucket[i]+=bucket[i-1];
        for (i=n-1; i>=0; i--)
            b[--bucket[a[i]/exp%10]]=a[i];
        for (i=0; i<n;i++){
            a[i]=b[i];
        }
        exp*=10;
    }
}

我尝试通过替换

将其更改为降序排序
for (i=0; i<n;i++) {
    a[i]=b[i];
}

for (i=0; i<n;i++) {
    a[i]=b[n-i-1];
}

但它没有用。 我尝试过:[705,1725,99,9170,7013]

但结果是:[9170,7013,1725,99,705]

最后一个值总是错误的。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

问题是尝试在每次传递时反转数组,因为基数排序会保持相等值的顺序。在第三次通过之后,0705在0099(7> 0)之前结束。在最后一次传递中,最高有效数字为0,因此保持顺序,因此b [0] = 0705,b [1] = 0099,然后反转为[] = {...,0099,0705}。

不是在每次传递后反转,而是使用9位数反转用于存储桶的索引。评论的变化如下:

void RadixSort (int a[], int n){
int i, m=0, exp=1, b[MAX];
    for (i=0; i<n; i++)
        if (a[i]>m)
            m=a[i];
    while (m/exp>0)
    {
        int bucket[10]={0};
        for (i=0; i<n; i++)
            bucket[9-a[i]/exp%10]++;         // changed this line
        for (i=1; i<10; i++)
            bucket[i]+=bucket[i-1];
        for (i=n-1; i>=0; i--)
            b[--bucket[9-a[i]/exp%10]]=a[i]; // changed this line
        for (i=0; i<n;i++){
            a[i]=b[i];                       // changed this line
        }
        exp*=10;
    }
}