C语言实现基数排序 (数据结构 严蔚敏版)

C语言实现基数排序 (数据结构 严蔚敏版)

原代码

#include <stdio.h>
#define MAX_NUM_OF_KEY 3
#define RADIX 10
#define MAX_SPACE 10
typedef struct {
    int keys[MAX_NUM_OF_KEY];
    int next;
}SLCell;
typedef struct {
    SLCell r[MAX_SPACE];
    int keynum;
    int recnum;
}SLList;
typedef int ArrType[RADIX];
void ShowList(int* L){
    for (int i = 0; i < RADIX; ++i) {
    }
}
void Distribute(SLCell *r,int i,ArrType f,ArrType e){
    int j=0;
    for (; j < RADIX; ++j) {
        f[j]=0;
        e[j]=0;
    }
    for (int p=r[0].next; p ; p=r[p].next) {
        j=r[p].keys[i];
        if (!f[j]){
            f[j]=p;
        }else{
            r[e[j]].next=p;
        }//if
        e[j]=p;
        ShowList(e);
    }//for

}
void Collect(SLCell *r,int i,ArrType f,ArrType e){
    int j=0;
    for (; !f[j] ; j++) {}
    r[0].next=f[j];
    ShowList(f);
ShowList(e);
    int t=e[j];
    while (j<RADIX){
        for (j=j+1;(j<RADIX-1)&(!f[j]);j++){}
        if(f[j]){
            r[t].next=f[j];

            t=e[j];

        }//if
    }//while

    r[t].next=0;


}
void RadixSort(SLList *L){
    for (int i=0;i<L->recnum;i++){
        L->r[i].next=i+1;
    }
    L->r[L->recnum].next=0;
    ArrType f;
    ArrType e;
    for(int i=0;i<L->keynum;i++){
        Distribute(L->r,i,f,e);
        Collect(L->r,i,f,e);
    }

}
int GetHundred(int a){
    int b=a/100;
    return b;
}
int GetTen(int a){
    int b=GetHundred(a);
    int c=(a-b*100)/10;
    return c;
}
int GetOne(int a){
    int b=GetHundred(a);
    int c=GetTen(a);
    int d=a-b*100-c*10;
    return d;
}
int main(void) {
    int list[] = {0, 123, 658, 962, 423, 456, 862};
    SLList L;
    L.keynum = 3;
    L.recnum = 6;
    for (int i = 1; i <= L.recnum; i++) {
        L.r[i].keys[0] = GetOne(list[i]);
        L.r[i].keys[1] = GetTen(list[i]);
        L.r[i].keys[2] = GetHundred(list[i]);
    }
    RadixSort(&L);
    for (int i = L.r[0].next; i; i=L.r[i].next) {
        printf("%d%d%d  ", L.r[i].keys[2], L.r[i].keys[1], L.r[i].keys[0]);
    }
    return 1;
}

经测试原代码因为静态数组在取L[L.length+1]并不为零导致collect函数出错

改进后的代码

#include <stdio.h>
#define MAX_NUM_OF_KEY 3
#define RADIX 10
#define MAX_SPACE 10
typedef struct {
    int keys[MAX_NUM_OF_KEY];
    int next;
}SLCell;
typedef struct {
    SLCell r[MAX_SPACE];
    int keynum;
    int recnum;
}SLList;
typedef int ArrType[RADIX+2];
void ShowList(int* L){
    for (int i = 0; i < RADIX; ++i) {
    }
}
void Distribute(SLCell *r,int i,ArrType f,ArrType e){
    int j=0;
    for (; j < RADIX+2; ++j) {
        f[j]=0;
        e[j]=0;
    }
    for (int p=r[0].next; p ; p=r[p].next) {
        j=r[p].keys[i];
        if (!f[j]){
            f[j]=p;
        }else{
            r[e[j]].next=p;
        }//if
        e[j]=p;
        ShowList(e);
    }//for

}
void Collect(SLCell *r,int i,ArrType f,ArrType e){
    int j=0;
    for (; !f[j] ; j++) {}
    r[0].next=f[j];
    ShowList(f);
ShowList(e);
    int t=e[j];
    while (j<RADIX){
        for (j=j+1;(j<RADIX-1)&(!f[j]);j++){}
        if(f[j]){
            r[t].next=f[j];

            t=e[j];

        }//if
    }//while

    r[t].next=0;


}
void RadixSort(SLList *L){
    for (int i=0;i<L->recnum;i++){
        L->r[i].next=i+1;
    }
    L->r[L->recnum].next=0;
    ArrType f;
    ArrType e;
    for(int i=0;i<L->keynum;i++){
        Distribute(L->r,i,f,e);
        Collect(L->r,i,f,e);
    }

}
int GetHundred(int a){
    int b=a/100;
    return b;
}
int GetTen(int a){
    int b=GetHundred(a);
    int c=(a-b*100)/10;
    return c;
}
int GetOne(int a){
    int b=GetHundred(a);
    int c=GetTen(a);
    int d=a-b*100-c*10;
    return d;
}
int main(void) {
    int list[] = {0, 123, 658, 962, 423, 456, 862};
    SLList L;
    L.keynum = 3;
    L.recnum = 6;
    for (int i = 1; i <= L.recnum; i++) {
        L.r[i].keys[0] = GetOne(list[i]);
        L.r[i].keys[1] = GetTen(list[i]);
        L.r[i].keys[2] = GetHundred(list[i]);
    }
    RadixSort(&L);
    for (int i = L.r[0].next; i; i=L.r[i].next) {
        printf("%d%d%d  ", L.r[i].keys[2], L.r[i].keys[1], L.r[i].keys[0]);
    }
    return 1;
}

改进后将

typedef int ArrType[RADIX];

改为

typedef int ArrType[RADIX+2];

代码成功运行

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值