【问题标题】:Radix Sort: Descending基数排序:降序
【发布时间】:2016-02-12 22:14:26
【问题描述】:

这是我的 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]

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

【问题讨论】:

  • 为什么不直接使用你的原始代码,然后当它完成后,反转列表?
  • 最后一个值(按降序排序后)是否总是等于输入数组中的第一个值(排序前)?

标签: c sorting radix


【解决方案1】:

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

【讨论】:

  • 非常感谢...现在我明白了:D
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 2013-01-10
  • 2016-02-21
  • 2022-01-05
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多