二维数组排序需依目标选择策略:按行独立排序仅使每行内有序;按列主键排序则重排整行;行列协同排序须兼顾顺序依赖,转置可用于按行值重排列。

二维数组的行排序与列排序不是简单相加,而是存在先后依赖关系:先按行整体排序(即把每行看作一个单元),再在行内或列间做进一步调整。关键在于明确“排序目标”——是让每行内部有序?还是让整个数组按某列主键升序、同值时按次列排序?不同目标对应完全不同的实现逻辑。
按行独立排序(每行内部升序)
这是最基础的操作,不改变行数和列数,只对每行单独调用一维排序算法:
- Java 中可用 Arrays.sort(arr[i]) 遍历每一行
- Python + NumPy 可用 np.sort(arr, axis=1) 沿列方向排序(即每行内排)
- C/C++ 需嵌套循环,对每行用冒泡、快排等手动实现
- 注意:该操作后,各行之间无大小关系,第一列不再有序
按列主键排序(整行重排,以某列为依据)
这是更常见的业务需求,例如“按成绩总分从高到低排学生记录”,本质是将二维数组视为记录集合,按指定列排序整行:
- NumPy 中最简洁:arr = arr[arr[:, col_index].argsort()](升序)
- 若需多级排序(如总分相同按姓名字母序),用 np.lexsort,传入元组如 (arr[:,1], arr[:,0]) 表示先按第1列、再按第0列
- Java 中需自定义 Comparator,比较逻辑为 a[col] - b[col],再用 Arrays.sort(arr, comparator)
- 该操作会打乱原始行顺序,但保证指定列单调
行列协同排序(先行后列,或先列后行)
当需要同时满足行内有序和列间有序时,不能分步执行——因为行排序会破坏列序,列排序又会打乱行内顺序。必须采用复合策略:
- 若目标是“每行升序,且首列也升序”,可先按首列排序整行,再对每行单独排序(此时首列已有序,行内排序不影响其相对位置)
- 若要求“所有元素全局升序铺满数组”,应先展平为一维、排序、再reshape回原尺寸
- Java 手写先行再列排序时,常见错误是把列索引写死为 1,实际应循环遍历所有列,对相同首列值的连续行块,在后续列上逐列稳定排序
- 稳定性很重要:使用稳定排序算法(如归并),才能保证次级列排序不破坏前级顺序
转置技巧实现“按行排序”效果
有时需求表面是“按某行排序列”,实则是想让列顺序反映该行数值大小,例如“按第三行数值从小到大重排各列”。这时可借助转置:
- NumPy:arr = arr.T[arr.T[:, row_index].argsort()].T
- 或更直观:arr = arr[:, arr[row_index].argsort()](直接对列索引排序)
- 本质是把目标行当作一维数组排序,拿到索引后重排所有列
- 该操作不改变行内结构,仅调整列的左右顺序











