键索引计数法简介
键索引计数法是低位优先(LSD),高位优先(MSD)的字符串排序算法的基础
实现过程
键索引计数法一般为五个步骤:
1. 频率统计
2. 将频率转换为索引
3. 数据分类
4. 回写
比如我们需要将一个班级的学生按照分组来排序。
1. 频率统计, 统计不同分组有多少个学生
2. 将频率转换为索引
3. 数据分类, 根据索引进行排序,放在临时数组aux中。
4. 回写
代码实现
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#define STUDENTNUM 4
#define KEYNUM 6
typedef struct {
char *name;
int num;
} Student, *StudentPtr;
typedef struct {
Student student[STUDENTNUM];
} Class, *ClassPtr;
void main() {
char name[STUDENTNUM][10] = {
{"John"},
{"Tom"},
{ "Hai" },
{ "Hti" },
};
char num[STUDENTNUM] = { 2,1,2,1 };
ClassPtr class = (ClassPtr)malloc(sizeof(Class));
memset(class, 0, sizeof(class));
for (int i = 0; i < STUDENTNUM; i++) {
Student s = { name[i], num[i] };
class->student[i] = s;
}
int count[KEYNUM];
for (int i = 0; i < KEYNUM; i++) {
count[i] = 0;
}
/******频率统计*******/
for (int i = 0; i < STUDENTNUM; i++) {
count[num[i] + 1]++;
}
/******频率统计*******/
/******将频率转换为索引*******/
for (int i = 0; i < KEYNUM && i + 1<KEYNUM; i++) {
count[i + 1] += count[i];
}
/******将频率转换为索引*******/
ClassPtr aux = (ClassPtr)malloc(sizeof(Class));
memset(aux, 0, sizeof(aux));
/******数据分类*******/
for (int i = 0; i < STUDENTNUM; i++) {
Student s = class->student[i];
aux->student[count[s.num]++] = s;
}
/******数据分类*******/
/******回写*******/
for (int i = 0; i < STUDENTNUM; i++) {
class->student[i] = aux->student[i];
}
/******回写*******/
free(class);
free(aux);
}