c++ - 在 C++ 中对二维数组进行排序

标签 c++ sorting multidimensional-array

假设我有一个像这样的二维数组 a[4][2]:

1 4
2 3
3 2
4 1

我想按照第二个数字的递增顺序对这个数组中的数组进行排序,即在排序之后,我希望数组是这样的:

4 1
3 2
2 3
1 4

我想制作一个存储第二列中数字索引的映射,然后制作第二列中数字的数组并对该数组进行排序,然后根据第二列的新顺序重建数组和 map 。然而,问题在于第二列中的两个数字可能不同,因此如果数字 i 出现两次,map[i] 将只存储其最后一个索引。此外,手动检查第一个数字对应于第二个数字的位置将花费 O(n^2) 时间。我想在 O(n log n) 中完成。有没有人有什么建议?是否有任何内置方法(C++ 4.3.2/4.8.1)?

提前致谢。

最佳答案

您可以使用 std::sort 轻松完成此操作.您需要提供自定义比较器,但这不是问题。

如果你使用 std::array 就容易多了定义您的二维数组,如下所示:

std::array< std::array< int, 2 >, 4 > twoDArray;

然后您可以按如下方式对其进行排序:

std::sort( twoDArray.begin(), twoDArray.end(), []( const std::array< int, 2 >& a, const std::array< int, 2 >& b )
{
    return a[1] < b[1];
}

对 C 风格的数组做同样的事情仍然是可能的,但是需要一个自定义迭代器的实现,它一次推进整个“行”,因为标准迭代器(即指针)会将 2D 数组视为它是一维的。

这是一个使用 C++ 数组的完整示例:

std::array< std::array< int, 2 >, 4 > arr   = {{ { 1, 4 },
                                                 { 2, 3 },
                                                 { 3, 2 },
                                                 { 4, 1 } }};

std::sort( arr.begin(), arr.end(), []( const std::array< int, 2 >& a, const std::array< int, 2 >& b )
    {
        return a[0] < b[0];
    } );

std::sort( arr.begin(), arr.end(), []( const std::array< int, 2 >& a, const std::array< int, 2 >& b )
    {
        return a[1] < b[1];
    } );

关于c++ - 在 C++ 中对二维数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27246045/

相关文章:

javascript - 使用 Javascript Fetch API 对异步获取的数据进行排序

C++通过模板传递双数组

php - 如何使用另一个数组中的键递归地构建关联数组?

javascript - 在 JavaScript 中将数据构建到多维数组中

c++ - Qt5 嘈杂的调试消息 "XI2 mouse release ... source MouseEventNotSynthesized"

c++ - 焦炭中的垃圾

javascript - 有什么方法可以扩展 javascript 的 array.sort() 方法以接受另一个参数?

algorithm - 按价格/质量比排序

c++ - 如何正确设置CMake项目?

c++ - 写入后跨进程读取文件一致性