如何使用Bubble Sort对结构体中的字符串按字母顺序排序?
修复你的冒泡排序实现(按字符串排序客户结构体数组)
你的代码存在多个关键问题,导致无法正常工作,下面逐一指出并给出修正方案:
- 参数类型完全错误:函数接收的是
float *data_set,但你要排序的是struct customer数组,必须把参数改成struct customer *data_set。 - 循环变量未声明:
customer和inner这两个循环变量没有定义类型,需要声明为int。 - 交换变量类型不匹配:
swap_temp是float指针,根本没法存储字符串,换成和last_name长度一致的字符数组才对。 - 排序逻辑混淆:你写的内层循环结构更像选择排序,不是冒泡排序。冒泡排序的核心是相邻元素两两比较,每轮把当前最大的元素“推”到数组末尾。
- strcmp条件搞反了:要按字母升序排序,当
strcmp(a.last_name, b.last_name) > 0时(a的姓氏比b靠后)才需要交换,你写的<0会导致排序结果完全颠倒。 - 交换步骤最后一步错误:最后一步应该把临时变量
swap_temp的内容复制给inner.last_name,而不是又把customer.last_name复制回去,等于没交换。 - 冗余变量无用:
customer_1、customer_2、customer_3这三个变量根本没用到,直接删掉。
修正后的完整代码:
#include <string.h> // 先确保你已经定义了正确的customer结构体 struct customer { char last_name[50]; // 长度根据实际需求调整 // 其他字段(比如名字、ID等)... }; void sort_customers(int num_customers, struct customer *data_set) { int i, j; char swap_temp[50]; // 和last_name的长度保持一致 // 冒泡排序核心逻辑:每轮处理后,末尾的i个元素已经是有序的 for (i = 0; i < num_customers - 1; i++) { for (j = 0; j < num_customers - 1 - i; j++) { // 比较相邻两个客户的姓氏,需要交换则执行操作 if (strcmp(data_set[j].last_name, data_set[j+1].last_name) > 0) { // 仅交换姓氏字段的写法 strcpy(swap_temp, data_set[j].last_name); strcpy(data_set[j].last_name, data_set[j+1].last_name); strcpy(data_set[j+1].last_name, swap_temp); // 如果需要交换整个客户结构体(而非仅姓氏),用下面的写法更简洁: // struct customer temp = data_set[j]; // data_set[j] = data_set[j+1]; // data_set[j+1] = temp; } } } }
补充说明:如果你的需求是排序整个客户结构体(而不只是姓氏),直接交换整个结构体实例会更简洁,不需要单独处理每个字段,代码里已经注释了这种写法。
内容的提问来源于stack exchange,提问作者big_brain-924
相关产品推荐
相关产品推荐

