C语言 键索引计数法

29 篇文章 0 订阅
7 篇文章 0 订阅

键索引计数法简介

键索引计数法是低位优先(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);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值