Я сортирую двумерный массив a[n][2], относительно a[i][0],a[i+1][0] разрывая связи с неубывающим a[i][1],a [я+1][1]. qsort отлично работает с целочисленным массивом, но не с длинным массивом.
Код целочисленного массива
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void* a, const void* b)
{
int x = ((int*)a)[0] - ((int*)b)[0];
if (x != 0) {
return x;
}
return ((int*)a)[1] - ((int*)b)[1];
}
int main(int argc, char const* argv[])
{
int n, i, j;
scanf("%d", &n);
int a[n][2];
for (i = 0; i < n; i = i + 1) {
scanf("%d %d", &a[i][0], &a[i][1]);
}
qsort(a, n, sizeof(a[0]), cmpfunc);
for (i = 0; i < n; i = i + 1) {
printf("%d %d\n", a[i][0], a[i][1]);
}
return 0;
}
длинный длинный код массива
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void* a, const void* b)
{
int x = ((int*)a)[0] - ((int*)b)[0];
if (x != 0) {
return x;
}
return ((int*)a)[1] - ((int*)b)[1];
}
int main(int argc, char const* argv[])
{
int n, i, j;
scanf("%d", &n);
long long a[n][2];
for (i = 0; i < n; i = i + 1) {
scanf("%I64d %I64d", &a[i][0], &a[i][1]);
}
qsort(a, n, sizeof(a[0]), cmpfunc);
for (i = 0; i < n; i = i + 1) {
printf("%I64d %I64d\n", a[i][0], a[i][1]);
}
return 0;
}
Вход:
5
4 3
4 2
4 1
4 1
4 1
Вывод для первого кода:
4 1
4 1
4 1
4 2
4 3
Вывод для второго кода:
4 2
4 1
4 1
4 1
4 3
long long
, вы ничего не забыли? Особенно в функции сравнения? Каков фактический типa
иb
? - person Some programmer dude   schedule 06.07.2017printf()
для просмотра значений переменных. - person Code-Apprentice   schedule 06.07.2017qsort()
. - person Stargateur   schedule 06.07.2017qsort
передает указатели на элементы в функцию сравнения, т.е. она передает&a[0]
(используя массивa
в функцииmain
), которые имеют типlong long (*)[2]
. - person Some programmer dude   schedule 06.07.2017