如何对存储单词计数的结构体数组按首字母+长度排序?
搞定结构体数组的首字母+单词长度复合排序
嘿,你已经把首字母排序的核心逻辑写出来了,现在只需要给比较条件加一层“首字母相同后的长度判断”就行,我给你一步步说清楚:
核心逻辑升级
你现在的代码只对比了单词的首字母,所以首字母相同的单词顺序是随机的。我们要给排序加个优先级:
- 第一优先级:按单词首字母的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
相关产品推荐
相关产品推荐

