2011-04-14 128 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);