如何通过排序单个数组实现多个关联数组同步排序
实现方案
核心思路是借助索引映射数组实现,只需要排序一次索引数组,后续直接按索引批量重写三个数组即可,不需要在排序交换阶段同步操作三个数组,代码量更精简。
实现逻辑
- 初始化一个长度和数组一致的索引数组,初始值为原数组的天然下标
0,1,2...n-1 - 对索引数组排序,排序规则为比较两个索引对应第一个数组
arr的值的大小 - 排序完成后的索引数组,存储的就是最终结果每个位置对应的原数组下标
- 按照索引数组的取值,批量重写三个原数组即可
完整代码示例
这里直接调用标准库的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
相关产品推荐
相关产品推荐

