Сортировка массива по другому массиву - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть массив с массивами из двух элементов. Теперь я хотел бы отсортировать все значения, заканчивающиеся на ноль (например, 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;

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Просто реализуйте свой собственный алгоритм поиска (используйте пузырьковую сортировку или что-то, что, по вашему мнению, может быть наиболее эффективным) и выполните сравнение / обмен, аналогично следующему псевдокоду:

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];
}

Если вы хотите отсортировать по нескольким столбцам, вам просто нужно повторить это, сравнивая другие элементы подмассива и сначала сортируя наименее значимый столбец.

Edit: Это также должно быть возможно с помощью qsort (). Вам просто нужно соответственно установить размер элемента (в вашем примере это 2 * sizeof(int)). Оставьте оставшуюся часть кода без изменений (хотя я не уверен в этом и сейчас не могу выполнить тестовый запуск).

0 голосов
/ 14 апреля 2011

У вас должен быть массив типа 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);
0 голосов
/ 14 апреля 2011

Один из способов сделать это:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...