#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);