C 基数排序:降序

C 基数排序:降序,c,sorting,radix,C,Sorting,Radix,这是我的RadixSort函数(升序): void RadixSort(int a[],int n) { int i,m=0,exp=1,b[MAX]; 对于(i=0;im) m=a[i]; } 而(m/exp>0) { int bucket[10]={0}; 对于(i=0;i问题是试图在每次传递时反转数组,因为基数排序保留相等值的顺序。在第三次传递后,0705在0099之前结束(7>0)。在最后一次传递中,最高有效位为0,因此顺序保持不变,因此b[0]=0705,b[1]=0099,然后反转为

这是我的RadixSort函数(升序):

void RadixSort(int a[],int n)
{
int i,m=0,exp=1,b[MAX];
对于(i=0;im)
m=a[i];
}
而(m/exp>0)
{
int bucket[10]={0};

对于(i=0;i问题是试图在每次传递时反转数组,因为基数排序保留相等值的顺序。在第三次传递后,0705在0099之前结束(7>0)。在最后一次传递中,最高有效位为0,因此顺序保持不变,因此b[0]=0705,b[1]=0099,然后反转为a[]={…,0099,0705}

不是每次通过后都反转,而是使用9位数字反转用于bucket的索引。更改注释如下:

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;
    }
}
void RadixSort(int a[],int n){
int i,m=0,exp=1,b[MAX];
对于(i=0;im)
m=a[i];
而(m/exp>0)
{
int bucket[10]={0};

对于(i=0;i为什么不只是使用您的原始代码,那么当它完成时,反转列表?最后一个值(按降序排序后)是否总是等于输入数组中的第一个值(排序前)?非常感谢…现在我得到了:D
for (i=0; i<n;i++) {
    a[i]=b[i];
}
for (i=0; i<n;i++) {
    a[i]=b[n-i-1];
}
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;
    }
}