You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对存储单词计数的结构体数组按首字母+长度排序?

搞定结构体数组的首字母+单词长度复合排序

嘿,你已经把首字母排序的核心逻辑写出来了,现在只需要给比较条件加一层“首字母相同后的长度判断”就行,我给你一步步说清楚:

核心逻辑升级

你现在的代码只对比了单词的首字母,所以首字母相同的单词顺序是随机的。我们要给排序加个优先级:

  • 第一优先级:按单词首字母的ASCII值从小到大排(和你原来的逻辑一致)
  • 第二优先级:当首字母相同时,按单词的长度从小到大排(如果要从长到短,把比较符号反过来就行)

修改后的选择排序代码

只需要改内层循环的判断条件,加上长度对比的逻辑就行,别忘了引入string.h来用strlen函数:

#include <string.h>

// 你的结构体定义
struct List { char word[20]; int repeat; };

void sortWordList(struct List array[], int length) {
    int i, j, min_pos;
    struct List swap;

    for (i = 0; i < length - 1; i++) {
        min_pos = i;
        for (j = i + 1; j < length; j++) {
            // 先比首字母,首字母小的优先
            if (array[j].word[0] < array[min_pos].word[0]) {
                min_pos = j;
            }
            // 首字母相同的话,再比单词长度
            else if (array[j].word[0] == array[min_pos].word[0]) {
                // 按长度从小到大排,要从大到小就改成 >
                if (strlen(array[j].word) < strlen(array[min_pos].word)) {
                    min_pos = j;
                }
                // (可选)如果长度也相同,还可以按完整单词的字典序排,比如:
                // else if (strcmp(array[j].word, array[min_pos].word) < 0) {
                //     min_pos = j;
                // }
            }
        }
        // 交换元素,把当前最小的放到i位置
        swap = array[min_pos];
        array[min_pos] = array[i];
        array[i] = swap;
    }
}

代码说明

  • 引入string.h是为了用strlen()获取单词的实际长度,避免手动数字符的麻烦。
  • 对比逻辑是分层的:先看首字母,首字母相同再看长度,甚至可以再加一层完整单词的字典序对比(注释里的代码),让排序更严谨。
  • 用你给的示例测试的话,排序后正好是你想要的结果:a 1 as 6 and 4 are 2 angry 1 appetite 1

额外优化:用标准库的快速排序

如果你的单词数量比较多,选择排序的效率有点低,不如直接用C标准库的qsort()函数,代码更简洁,效率也更高:

#include <string.h>
#include <stdlib.h>

struct List { char word[20]; int repeat; };

// 给qsort用的比较函数
int compareWordItems(const void *a, const void *b) {
    const struct List *itemA = (const struct List *)a;
    const struct List *itemB = (const struct List *)b;

    // 先比首字母
    int charDiff = itemA->word[0] - itemB->word[0];
    if (charDiff != 0) {
        return charDiff;
    }
    // 首字母相同比长度
    int lenDiff = strlen(itemA->word) - strlen(itemB->word);
    if (lenDiff != 0) {
        return lenDiff;
    }
    // 长度相同比完整字典序
    return strcmp(itemA->word, itemB->word);
}

// 使用方式:直接调用qsort就行
// qsort(your_array, array_length, sizeof(struct List), compareWordItems);

qsort()是快速排序实现,处理大规模数据比选择排序快很多,推荐在数据量较大的时候用~

内容的提问来源于stack exchange,提问作者psykana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:09