【题目】已知记录序列L.rcd[1…L.length]中的关键字各不相同,可按如下所述实现计数排序:另设数组c[1…n],对每个记录a[i], 统计序列中关键字比它小的记录个数存于c[i],则c[i]=0的记录必为关键字最小的记录,然后依c[i]值的大小对序列中记录进行重新排列。试编写算法实现上述排序方法。
顺序表的类型RcdSqList定义如下:
typedef struct {
KeyType key;
…
} RcdType;
typedef struct {
RcdType rcd[MAXSIZE+1]; // rcd[0]闲置
int length;
} RcdSqList;
实现下列函数:
void CountSort(RcdSqList &L);
/* 采用顺序表存储结构,在函数内自行定义计数数组c */
本题是对于计数排序的应用,注意参考书本排序算法中辅助数组的理解以及边界的理解即可;结合图像对于正确的做计数排序有很大的帮助;
答案仅供参考:
void CountSort(RcdSqList &L)
/* 采用顺序表存储结构,在函数内自行定义计数数组c */
{
if(&L!=NULL&&L.length!=0) {
//这里亦可以采用数组的形式,但是题主认为由于其未给出排序确切的元素类型(int/char/String的某一位置等)不太好用数组,由于计数排序必须知道类型以确认计数数组的大小,用动态数组修改参数更简易;
int *all;
int *c;
int wordNum = 26;
all = (int*)malloc(sizeof(int)*wordNum);
c = (int*)malloc(sizeof(int)*wordNum);
//数据初始化;
for(int i=0;i<wordNum;i++) {
all[i] = c[i] = 0;
}
//逐个计数
for(int i=0;i<=MAXSIZE;i++) {
all[L.rcd[i+1].key-65]++;
}
//确认位置
c[0] = 1;
for(int i=1;i<wordNum;i++) {
c[i] = c[i-1]+all[i-1];
}
//写入
RcdType rcdSwap[L.length+1];
for(int i=1;i<=L.length;i++) {
rcdSwap[c[L.rcd[i].key-65]++] = L.rcd[i];
}
for(int i=1;i<=L.length;i++) {
L.rcd[i] = rcdSwap[i];
}
}
}