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];
代码成功运行