在子阵列C 中按第一个项目对数组进行排序

sort array by first item in subarray c++

本文关键字:数组 排序 项目 第一个 阵列      更新时间:2023-10-16

我有一个数组数组,例如: [[4, 204], [10, 39], [1, 500]])。我想按子阵列的第一个元素对它们进行排序,以便它变为: [[1, 500], [4, 204], [10, 39]]

我找不到C++的任何答案。

我将如何在C++中执行此操作?

代码:

int n;
int time;  
int timeTable[100][2];
if (inputFile.is_open()) {
    for (int i = 0; i < 100; i++) {
        inputFile >> n;
        timeTable[i][0] = n;
        inputFile >> time;
        timeTable[i][1] = time;
    }
}

对数组进行排序的一种方法是不排序数组本身

相反,对数组内部指向的索引数组进行排序,然后使用排序的索引访问元素。这样做比在排序函数中操纵2D数组要容易得多。

通常,如果您有索引数组的内存(我们需要索引数组的其他存储),则对具有

的对象进行排序
  1. 每个项目的有效载荷较大,
  2. 数组的原始顺序需要保留,或者
  3. 排序只是笨拙 1 或不可能在排序算法中轻松操纵,

可以使用此处描述的技术。

这是一个示例:

#include <algorithm>
#include <iostream>
int main()
{
    int index[3] = {0,1,2};
    int timeTable[3][2] = {{4, 204}, {10, 39}, {1, 500}};
    std::sort(index, index + 3, [&](int n1, int n2){ return timeTable[n1][0] < timeTable[n2][0]; });
    for (int i = 0; i < 3; ++i)
       std::cout << "The index is " << index[i] << ".  The data at this index is  [" << 
                 timeTable[index[i]][0] << " " << timeTable[index[i]][1] << "]n";
}

实例示例

基本上,我们创建了一个初始索引数组,该索引数组从0到n-1,其中n是要排序的项目数。然后,我们在索引上调用std::sort,在排序标准中,我们使用传递给分类谓词的索引中的实际数组中的项目进行比较。结果将是索引数组在排序过程中交换其元素,而不是交换原始数组的元素。

请注意,排序谓词非常简单 - 我们通过使用timeTable数组上传递的索引来确切说明我们希望索引在排序中表示的内容。没有棘手,容易出错的或代码,如果其中一个项目不正确(例如,平行阵列方案 - 想象20个数组,则不得不交换20个项目,只是因为一个项目已输出订单)。

对索引进行排序后,当需要使用timeTable数组时,我们使用索引数组指向项目(请注意我们如何使用timeTable[index[i]][0]而不是timeTable[i][0]指定索引)。


1 "笨拙"中包含类别是"平行的"阵列排序"出现在Stackoverflow上的问题,要求海报并行对多个阵列进行排序。基于其中一个数组中的数据。