基于姓氏对customers结构体实现冒泡排序失败,请求问题排查
你的冒泡排序代码问题分析与修复
先把你代码里的致命问题列出来:
- 外层循环行末尾多了个
0,这是语法错误,编译器直接报错,先删掉它。 - 内层循环的遍历逻辑完全搞反:从数组首元素
p_info开始就p_walker--会直接越界,且条件(p_walker-p_info) > current不符合冒泡排序的遍历规则。 - 比较逻辑错误:拿当前遍历元素和数组首元素对比,而非冒泡排序要求的相邻元素比较。
- 交换逻辑错误:仅交换指针变量本身,没有修改结构体数组里的实际元素,原数组根本不会被排序。
针对你的需求(按姓氏字典序升序排序),修正后的代码如下:
void sort_customers(struct customers *p_info, int num_customers) { struct customers temp; // 用结构体变量存临时数据,而非指针 int current; int swapped; // 优化冒泡排序,提前退出无交换的循环 for (current = 0; current < num_customers - 1; current++) { swapped = 0; // 内层循环遍历未排序的前半部分,每轮会把最大元素推到末尾 for (struct customers *p_walker = p_info; p_walker < p_info + num_customers - 1 - current; p_walker++) { // 比较相邻元素的姓氏,前者字典序更大则交换 if (strcmp(p_walker->last_name, (p_walker + 1)->last_name) > 0) { // 交换两个结构体的实际内容 temp = *p_walker; *p_walker = *(p_walker + 1); *(p_walker + 1) = temp; swapped = 1; } } // 本轮无交换说明数组已完全有序,提前结束排序 if (!swapped) { break; } } return; }
关键修改说明:
- 移除了外层循环末尾的多余
0,修复语法错误。 - 调整内层循环的遍历范围,每轮跳过已经排好序的末尾元素,提升效率。
- 改为比较相邻元素的姓氏,符合冒泡排序的核心逻辑。
- 交换结构体的实际内容(通过
*p_walker访问元素),确保原数组被真正修改。 - 添加
swapped标记优化排序过程,避免不必要的循环。
测试你的输入Jones, Smith, Allen,这个代码会输出预期的Allen, Jones, Smith。
内容的提问来源于stack exchange,提问作者big_brain-924
相关产品推荐
相关产品推荐

