C语言 键索引计数法

      • 键索引计数法简介
        • 实现过程
        • 代码实现

键索引计数法简介

键索引计数法是低位优先(LSD),高位优先(MSD)的字符串排序算法的基础

实现过程

键索引计数法一般为五个步骤:
1. 频率统计
2. 将频率转换为索引
3. 数据分类
4. 回写

比如我们需要将一个班级的学生按照分组来排序。
C语言 键索引计数法_第1张图片
1. 频率统计, 统计不同分组有多少个学生
C语言 键索引计数法_第2张图片
2. 将频率转换为索引
C语言 键索引计数法_第3张图片
3. 数据分类, 根据索引进行排序,放在临时数组aux中。
C语言 键索引计数法_第4张图片
4. 回写

代码实现

#include 
#include 
#include 
#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 + 11] += 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);
}

你可能感兴趣的:(c,算法,字符串)