Сортировка массива в соответствии с другим массивом

#c #arrays #sorting

#c #массивы #сортировка

Вопрос:

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

Ответ №1:

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

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

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

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

Комментарии:

1. Спасибо!! Мне нужно было только изменить это: sizeof(int) на 2 * sizeof(int)

Ответ №2:

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

 using namespace std;
struct Compare
{
    bool operator()(const pair<int,int>amp; p1,
                    const pair<int,int>amp; 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;
}
  

Ответ №3:

Обязательно ли иметь массив типа int[][] ? Если нет, вы могли бы сделать что-то вроде следующего (более или менее похожее на ответ Аши, я уже печатал это, когда появился его ответ).

 #include <algorithm>
#include <utility>

struct cmpTwoIntsPair
{
  bool operator() (pair<int, int> const amp; lhs, pair<int, int> const amp; 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);