我是 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;
}
这仍然有效,并产生相同的结果。谁能向我解释我删除了什么,为什么它仍然有效?
第二部分:为什么是指针?
另外,我真的需要使用指针吗?为什么我不能像这样直接比较“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;
}
我真的很高兴多维数组排序正在工作,因为这是我的最终目标,但我不知道我是如何设法让它工作的(除了愚蠢的运气和砍掉代码)所以我真的很喜欢一些解释为什么我提供的一些示例有效,而为什么有些无效!