C语言初学者必看:如何用冒泡排序实现英文单词长度排序(附完整代码)

张开发
2026/4/16 12:31:45 15 分钟阅读

分享文章

C语言初学者必看:如何用冒泡排序实现英文单词长度排序(附完整代码)
C语言实战用冒泡排序算法处理英文单词长度排序在编程学习的早期阶段掌握基础算法和字符串处理是每个C语言学习者的必经之路。今天我们要探讨的是一个既经典又实用的案例——如何用冒泡排序算法对一组英文单词按长度进行排序。这个案例不仅涵盖了基本的输入输出操作还涉及字符串处理、数组应用和算法实现是检验初学者C语言综合能力的绝佳练习。1. 理解问题需求与准备工作在开始编码之前我们需要明确问题的具体要求。题目要求我们编写一个程序能够接收用户输入的一系列英文单词以#作为结束标志然后对这些单词按照长度从小到大进行排序。如果两个单词长度相同则保持它们原有的输入顺序不变。为了完成这个任务我们需要准备以下知识基础字符串的存储与处理C语言中字符串通常用字符数组表示基本的输入输出操作特别是如何读取不定数量的输入冒泡排序算法虽然效率不高但实现简单适合初学者字符串长度计算使用strlen函数字符串复制操作使用strcpy函数#include stdio.h #include string.h // 提供strlen和strcpy函数2. 数据存储与输入处理2.1 设计数据结构首先需要考虑如何存储输入的单词。根据题目要求我们需要存储最多20个单词每个单词长度不超过10个字符加上终止符\0需要11个字符空间因此我们可以定义一个二维字符数组char words[20][11]; // 20个单词每个单词最多10个字符\02.2 实现输入循环我们需要一个循环来持续读取用户输入直到遇到#为止。这里使用while循环配合break语句是常见做法int count 0; // 记录已输入的单词数量 while (1) { scanf(%s, words[count]); if (words[count][0] #) { break; } count; }注意事项使用count变量跟踪实际输入的单词数量检查输入的第一个字符是否为#来判断是否结束题目保证输入不超过20个单词所以不需要额外检查数组越界3. 实现冒泡排序算法3.1 标准冒泡排序回顾冒泡排序的基本思想是通过多次遍历数组每次比较相邻元素如果顺序不对就交换它们。对于整数排序典型的实现如下for (int i 0; i n-1; i) { for (int j 0; j n-i-1; j) { if (arr[j] arr[j1]) { // 交换arr[j]和arr[j1] int temp arr[j]; arr[j] arr[j1]; arr[j1] temp; } } }3.2 适配字符串排序需求我们需要对上述算法进行修改以适应字符串长度排序的需求比较条件改为字符串长度比较交换操作需要使用strcpy函数完成字符串复制char temp[11]; // 临时存储空间用于交换字符串 for (int i 0; i count-1; i) { for (int j 0; j count-i-1; j) { if (strlen(words[j]) strlen(words[j1])) { // 交换words[j]和words[j1] strcpy(temp, words[j]); strcpy(words[j], words[j1]); strcpy(words[j1], temp); } } }关键点说明temp数组大小必须足够存储最长的字符串使用strlen()获取字符串长度进行比较strcpy()用于字符串的复制交换保持稳定排序长度相同时不交换4. 完整代码实现与优化4.1 基础版本实现将上述各部分组合起来我们得到完整的程序#include stdio.h #include string.h #define MAX_WORDS 20 #define MAX_LENGTH 11 int main() { char words[MAX_WORDS][MAX_LENGTH]; int count 0; // 输入处理 while (count MAX_WORDS) { scanf(%s, words[count]); if (words[count][0] #) { break; } count; } // 冒泡排序 char temp[MAX_LENGTH]; for (int i 0; i count-1; i) { for (int j 0; j count-i-1; j) { if (strlen(words[j]) strlen(words[j1])) { strcpy(temp, words[j]); strcpy(words[j], words[j1]); strcpy(words[j1], temp); } } } // 输出结果 for (int i 0; i count; i) { printf(%s , words[i]); } return 0; }4.2 代码优化建议虽然上面的代码已经可以正确运行但我们还可以做一些改进添加输入验证虽然题目保证输入合法但实际应用中应该检查提高可读性将排序逻辑封装成函数优化性能添加提前终止标志优化后的排序函数可能如下void bubbleSortWords(char words[][MAX_LENGTH], int count) { char temp[MAX_LENGTH]; int swapped; for (int i 0; i count-1; i) { swapped 0; for (int j 0; j count-i-1; j) { if (strlen(words[j]) strlen(words[j1])) { strcpy(temp, words[j]); strcpy(words[j], words[j1]); strcpy(words[j1], temp); swapped 1; } } if (!swapped) break; // 如果没有发生交换提前结束 } }5. 常见问题与调试技巧初学者在实现这个程序时经常会遇到一些问题下面列举几个典型情况5.1 字符串存储空间不足char word[10]; // 错误只能存储9个字符\0不符合题目要求正确做法char word[11]; // 可以存储10个字符\05.2 字符串比较错误直接使用比较运算符比较字符串是错误的if (words[j] words[j1]) // 错误这比较的是地址而非内容正确做法if (strlen(words[j]) strlen(words[j1])) // 比较长度5.3 输入处理问题在读取输入时需要注意使用scanf(%s, ...)会自动跳过空白字符但无法处理包含空格的字符串本题不要求确保输入缓冲区不会溢出5.4 排序稳定性问题题目要求长度相同的单词保持输入顺序因此// 只有当长度严格大于时才交换 if (strlen(words[j]) strlen(words[j1])) { // 交换操作 }如果写成就会破坏稳定性。6. 扩展思考与实际应用掌握了这个基础版本后我们可以考虑一些扩展方向6.1 支持更多排序方式修改比较逻辑可以实现不同的排序方式按字典序排序使用strcmp()函数不区分大小写排序先统一转换为小写/大写多重条件排序先按长度长度相同再按字典序6.2 性能优化方向虽然冒泡排序简单易懂但其时间复杂度为O(n²)对于大量数据效率低下。可以考虑使用更高效的排序算法如快速排序、归并排序对于字符串排序可以考虑基数排序等专用算法使用指针数组代替二维数组减少数据移动开销6.3 实际应用场景这种字符串排序技术在现实中有很多应用文本处理工具中的单词频率统计字典应用程序的单词列表展示搜索引擎的结果排序简化版数据分析中的分类处理7. 测试用例与验证方法为了确保程序的正确性应该设计全面的测试用例测试用例描述输入样例预期输出测试要点常规输入hello world code #code hello world 基本功能验证空输入# (无输出)边界条件单单词programming #programming 最小输入等长单词cat dog pig #cat dog pig 稳定性验证最大数量20个单词#按长度排序的20个单词容量测试混合长度a bc def ghij klmno #a bc def ghij klmno 多种长度在Linux环境下可以使用shell脚本进行自动化测试#!/bin/bash # 编译程序 gcc -o word_sort word_sort.c # 测试1: 常规输入 echo hello world code # | ./word_sort | grep -q code hello world echo Test 1 PASSED || echo Test 1 FAILED # 测试2: 空输入 echo # | ./word_sort | [ $(wc -c) -eq 0 ] echo Test 2 PASSED || echo Test 2 FAILED # 更多测试...8. 进阶学习路径掌握了这个基础案例后可以继续深入学习以下内容更高效的排序算法快速排序归并排序堆排序字符串处理进阶正则表达式Unicode字符串处理字符串匹配算法C语言高级特性函数指针可用于实现通用排序动态内存分配结构体和联合实际项目应用开发简单的文本处理工具参与开源项目如grep、sed等的基础功能算法竞赛中的字符串处理题目// 使用函数指针实现通用排序的示例 typedef int (*compare_func)(const char*, const char*); void sort_words(char words[][MAX_LENGTH], int count, compare_func cmp) { // 实现细节类似冒泡排序但使用cmp函数进行比较 }这个简单的单词排序程序虽然代码量不大但涵盖了C语言学习的多个重要概念。通过不断练习和扩展这样的案例可以逐步提升编程能力和算法思维。

更多文章