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

如何通过排序单个数组实现多个关联数组同步排序

实现方案

核心思路是借助索引映射数组实现,只需要排序一次索引数组,后续直接按索引批量重写三个数组即可,不需要在排序交换阶段同步操作三个数组,代码量更精简。

实现逻辑

  1. 初始化一个长度和数组一致的索引数组,初始值为原数组的天然下标0,1,2...n-1
  2. 对索引数组排序,排序规则为比较两个索引对应第一个数组arr的值的大小
  3. 排序完成后的索引数组,存储的就是最终结果每个位置对应的原数组下标
  4. 按照索引数组的取值,批量重写三个原数组即可

完整代码示例

这里直接调用标准库的qsort实现,不需要手动写排序算法,代码最精简:

#include <stdio.h>
#include <stdlib.h>

// 要同步的三个数组和长度,定义为全局简化比较函数逻辑,不需要额外传参
int arr[] = {20, 10, 5, 22};
int arr2[] = {120, 344, 43, 122};
int arr3[] = {2234, 12, 23, 3434};
int len = sizeof(arr) / sizeof(arr[0]);

// qsort比较规则:按arr对应值从小到大排序索引
int cmp(const void *a, const void *b) {
    int idx1 = *(int*)a;
    int idx2 = *(int*)b;
    return arr[idx1] - arr[idx2];
}

int main() {
    // 初始化索引数组
    int *idx = (int*)malloc(len * sizeof(int));
    for (int i = 0; i < len; i++) idx[i] = i;

    // 仅排序索引数组,不需要操作三个业务数组
    qsort(idx, len, sizeof(int), cmp);

    // 用临时数组存储结果,避免覆盖原数组导致取值错误
    int *tmp = (int*)malloc(len * sizeof(int));
    int *tmp2 = (int*)malloc(len * sizeof(int));
    int *tmp3 = (int*)malloc(len * sizeof(int));

    for (int i = 0; i < len; i++) {
        tmp[i] = arr[idx[i]];
        tmp2[i] = arr2[idx[i]];
        tmp3[i] = arr3[idx[i]];
    }

    // 结果拷贝回原数组
    for (int i = 0; i < len; i++) {
        arr[i] = tmp[i];
        arr2[i] = tmp2[i];
        arr3[i] = tmp3[i];
    }

    // 输出验证
    for (int i = 0; i < len; i++) printf("%d ", arr[i]);
    printf("\n");
    for (int i = 0; i < len; i++) printf("%d ", arr2[i]);
    printf("\n");
    for (int i = 0; i < len; i++) printf("%d ", arr3[i]);

    // 释放内存
    free(idx); free(tmp); free(tmp2); free(tmp3);
    return 0;
}

运行输出

5 10 20 22 
43 344 120 122 
23 12 2234 3434

如果不想使用全局变量,可以将三个数组和长度封装为结构体,使用带上下文参数的qsort_r(部分编译器支持)实现,兼容性要求高的场景下全局变量是最低代码量的实现方案。

内容的提问来源于stack exchange,提问作者disamaj964

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:04