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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:10:28