索引排序核心是不移动原数据,仅调整索引数组顺序,再按索引访问得到有序视图;索引数组index[i]主流含义为“排序后第i位取原数组的下标index[i]”,适用于大对象排序、二维数组按列排序等场景,兼顾效率与原始顺序保留。

直接用索引数组排序,核心不是动原数据,而是让索引“指哪打哪”——原数组不动,只调整索引顺序,再按索引读取,就得到排序结果。这对大对象、结构体或字符串数组特别实用,省内存、避免拷贝、还能保留原始顺序。
索引数组怎么建?两种常见含义要分清
索引数组 index[i] 有两种主流解释,选错会导致重排逻辑出错:
- 含义一(推荐初学用):index[i] 表示“排序后第 i 个位置上,该取原数组的哪个下标”。即最终输出是 array[index[0]], array[index[1]], …
- 含义二:index[i] 表示“原数组第 i 个元素,在排序后应排在第几个位置”。这个更适合做逆向映射或稳定排序校验,但重排更绕。
绝大多数场景(如按某字段排序二维数组)用第一种更直观、不易错。
用索引实现多维数组按列排序
比如有个二维数组 data = [[ "Alice", 28, 7500 ], [ "Bob", 32, 6200 ], [ "Cara", 25, 8100 ]],想按薪资(第2列,索引为2)降序排:
- 先初始化索引数组:index = [0, 1, 2]
- 对 index 排序,比较依据是 data[i][2],不是 index[i] 本身:
// C 或伪代码逻辑if (data[index[a]][2] - 排序完成后,遍历 index 输出:data[index[0]], data[index[1]], data[index[2]] —— 就是按薪资从高到低的结果。
避免原地交换,用索引模拟经典算法
快速排序、归并排序都可以只操作索引数组,不碰原数据:
- 快排分区时,比较的是 array[index[pivot]] vs array[index[i]],交换的只是 index 中的值
- 归并时,辅助数组也只存索引,合并逻辑完全不变,只是所有 array[x] 都换成 array[index[x]]
- C/C++ 中常配合函数指针或宏封装比较逻辑,Python/JS 则可直接在 sort 的 compare 函数里引用原数组
注意边界:重复值与稳定性
索引排序天然支持稳定排序——只要你在比较函数中加入“相等时按原始下标小者优先”的规则:
- 例如 JS:
(a, b) => data[a][2] === data[b][2] ? a - b : data[b][2] - data[a][2](降序 + 稳定) - C 中可在比较函数里加二级判断:
if (val_a == val_b) return idx_a - idx_b; - 若忽略相等情况,默认行为可能打乱相同元素的相对顺序











