2014-12-02 72 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

您可以按第一項對它們排序一次,然後再使用第二欄對它們進行排序。這與基數排序的工作方式類似。