2014-12-02 75 views
1

假设我有一个2-d数组a [4] [2]这样的:排序用C二维阵列++

1 4 
2 3 
3 2 
4 1 

我想在其第二的顺序增加此数组中的数组进行排序号码,在排序之后,即,我想阵列是这样的:

4 1 
3 2 
2 3 
1 4 

我想拍图存储该号码的索引在所述第二列,然后使数字阵列的在第二列中对该数组进行排序,然后从第二列a的新顺序重新构建数组找到地图。然而,问题在于第二列中的两个数字可能并不明确,因此如果数字i出现两次,map [i]将只存储其最后一个索引。另外,手动检查对应于第二个数字的第一个数字的位置将花费O(n^2)时间。我想在O(n log n)中做到这一点。有没有人有什么建议?有没有内置的方法(C++ 4.3.2/4.8.1)?

在此先感谢。

回答

3

您可以用std::sort轻松做到这一点。你需要提供一个自定义比较器,但那不是问题。

它容易得多,如果你使用std::array来定义您的2维数组,虽然如下:

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

做同样具有C-:

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

如下然后,您可以对它进行排序样式数组仍然是可能的,但是需要实现一个自定义迭代器,该迭代器一次将整个“行”推进,因为标准迭代器(即指针)会将2D数组视为1D。

下面是使用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]; 
    }); 
0

您可以按第一项对它们排序一次,然后再使用第二栏对它们进行排序。这与基数排序的工作方式类似。