Я начинаю с C, и я пытаюсь понять функцию сравнения, необходимую для функции qsort.
Часть первая: синтаксис
Простым предлагаемым использованием является это (я также включил некоторый код main() для печати результатов):
#include <stdio.h>
#include <stdlib.h>
int values[] = { 40, 10, 100, 90, 20, 25, 12, 13, 10, 40 };
int compare (const void *a, const void *b)
{
const int *ia = (const int *)a; // casting pointer types
const int *ib = (const int *)b;
return *ia - *ib;
}
int main ()
{
int n;
for (n=0; n<10; n++)
{
printf("%d ",values[n]);
}
printf("\n");
qsort (values, 10, sizeof(int), compare);
for (n=0; n<10; n++)
{
printf ("%d ",values[n]);
}
printf("\n");
system("pause");
return 0;
}
Я не понимаю, зачем вам нужны все лишние вещи в функции сравнения, поэтому я упростил это:
int compare (int *a, int *b)
{
return *a-*b;
}
Это все еще работает и дает те же результаты. Может ли кто-нибудь объяснить мне, что я удалил, и почему он все еще работает?
ЧАСТЬ 2: Почему указатели?
Кроме того, действительно ли нужно использовать указатели? Почему я не могу просто сравнить "a" и "b" прямо так (это НЕ работает):
int compare (int a, int b)
{
return a-b;
}
По какой-то причине, с многомерным массивом, я смог уйти с НЕ с помощью указателей, и по какой-то причине он сработает! что происходит! (Пример кода сортировки многомерного массива по 2-му элементу в каждом вспомогательном массиве):
#include <stdio.h>
#include <stdlib.h>
int values[7][3] = { {40,55}, {10,52}, {100,8}, {90,90}, {20,91}, {25,24} };
int compare (int a[2], int b[2])
{
return a[1] - b[1];
}
int main ()
{
int n;
for (n=0; n<6; n++)
{
printf ("%d,",values[n][0]);
printf ("%d ",values[n][1]);
}
printf("\n");
qsort (values, 6, sizeof(int)*3, compare);
for (n=0; n<6; n++)
{
printf ("%d,",values[n][0]);
printf ("%d ",values[n][1]);
}
printf("\n");
system("pause");
return 0;
}
Я очень рад, что многомерная сортировка массивов работает, так как это моя конечная цель , но я не знаю, как мне удалось заставить ее работать (кроме немой удачи и измельчения код), поэтому мне действительно понравилось бы объяснение того, почему некоторые из примеров, которые я предоставил, работают, и почему некоторые не делают этого! Спасибо!