2011-04-14 191 views
0

我有一個包含兩個元素數組的數組。現在我想將所有以0結尾的值(例如arr[3][0],arr[1][0])按從低到高排序。根據其他數組排序數組

然後我想讓值爲1(例如arr[2][1],arr[1][1])也被排序,但不是按照它自己的順序排列,而是按照與第一個數組相同的順序排序。

這裏是我的嘗試:

int compareInts(const void* a, const void* b) 
{ 
    return (*(int*) a[0] - *(int*) b[0]); 
} 

int arr[4][2]; 

arr[0][0] = 50; 
arr[0][1] = 0; 

arr[1][0] = 40; 
arr[1][1] = 1; 

arr[2][0] = 50; 
arr[2][1] = 2; 

arr[3][0] = 85; 
arr[3][1] = 3; 

qsort(arr, 4, sizeof(int), compareInts); 


我想有以下結果:

arr[0][0] = 40; 
arr[0][1] = 1; 

arr[1][0] = 50; 
arr[1][1] = 0; 

arr[2][0] = 50; 
arr[2][1] = 2; 

arr[3][0] = 85; 
arr[3][1] = 3; 

回答

2

只是實現自己的搜索算法(使用冒泡排序或任何你認爲可能是最高效),並進行類似於以下僞代碼的比較/交換:

if(a[i][0] > a[j][0]) 
{ 
    t[0] = a[i][0]; 
    t[1] = a[i][1]; 
    a[i][0] = a[j][0]; 
    a[i][1] = a[j][1]; 
    a[j][0] = t[0]; 
    a[j][1] = t[1]; 
} 

如果您想基於多個列進行排序,您只需重複此操作即可比較其他子數組元素,並首先對最不重要的列進行排序。

編輯: 我thik這應該也可以使用qsort()。您只需相應地設置元素大小(在您的示例中應爲2 * sizeof(int))。保持代碼的其餘部分不變(儘管我不確定這一點,現在不能測試運行)。要做到這一點

+0

謝謝!!我只需要將這個:sizeof(int)'改爲'2 * sizeof(int)' – Datoxalas 2011-04-14 13:26:42

0

方式一:

using namespace std; 
struct Compare 
{ 
    bool operator()(const pair<int,int>& p1, 
        const pair<int,int>& p2) 
    { 
     return p1.first < p2.first; 
    } 
}; 

int main() 
{ 
    int arr[4][2]; 

    arr[0][0] = 50; 
    arr[0][1] = 0; 

    arr[1][0] = 40; 
    arr[1][1] = 1; 

    arr[2][0] = 50; 
    arr[2][1] = 2; 

    arr[3][0] = 85; 
    arr[3][1] = 3; 

    //Create a vector of pairs 
    vector<pair<int,int> > pairs; 
    for(int i = 0; i < 4; ++i) 
    { 
     pairs.push_back(make_pair(arr[i][0], arr[i][1])); 
    } 

    //Sort the vector on the first element using the functor 
    stable_sort(pairs.begin(), pairs.end(), Compare()); 

    //Copy the result back 
    for(size_t idx = 0; idx < pairs.size(); ++idx) 
    { 
     arr[idx][0] = pairs[idx].first; 
     arr[idx][1] = pairs[idx].second; 
    } 
    return 0; 
} 
0

你必須有int[][]類型的數組?如果沒有,你可以做類似下面的事情(或多或少像阿莎回答,當他的答案出現時我已經打字了)。

#include <algorithm> 
#include <utility> 

struct cmpTwoIntsPair 
{ 
    bool operator() (pair<int, int> const & lhs, pair<int, int> const & rhs) 
    { 
    return lhs.first < rhs.first; 
    } 
} 

typedef std::pair<int, int> twoInts; 

unsigned int arrSize = 5; 
twoInts arr[arrSize]; 

... Insert values here ... 

std::sort(arr, arr + arrSize, cmpTwoIntsPair);