我想使用 qsort() 对数组 a 相对于 b 进行排序。能给我功能吗?
a={0,1,2,3,4} b={3,4,5,1,2}
答案必须是 {3,4,0,1,2}
请给我功能代码。
喜欢 :
int compare (const void *a,const void *b)
{
return(*(char *)a-*(char *)b);
}
这不可能是您目前拥有的方式,因为 qsort() 接受一个数组并将数组的元素相互比较。您需要创建一个包含两个值的结构数组,如下所示:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int a;
int b;
} c_type;
int
compare(const void *a,
const void *b) {
return ((c_type *)a)->b - ((c_type *)b)->b;
}
int
main(int argc,
char *argv[])
{
int i = 0;
c_type array[] = {{0, 3}, {1, 4}, {2, 5}, {3, 1}, {4, 2}};
qsort(array, sizeof array / sizeof(*array), sizeof(*array), compare);
for ( i = 0; i < sizeof array / sizeof(*array); i++ ) {
printf("%d\t", array[i].a);
}
printf("\n");
return 0;
}
您需要一种机制来通知比较函数要比较的内容,而不是与存储在传递给它的地址中的值进行比较的普通实现。这可以通过static
(全局)存储来实现:
#include<stdlib.h>
int *Array= NULL;
void SetArray(int *const array)
{
Array= array;
}
int basecompare(const void *a, const void *b)
{
return Array[*((int *) a)]- Array[*((int *) b)];
}
int main(int argc, char *argv[])
{
int a[]= { 0, 1, 2, 3, 4 };
int b[]= { 3, 4, 5, 1, 2 };
size_t len= sizeof(a)/ sizeof(a[0]);
SetArray(b);
qsort(a, len, sizeof(int), basecompare);
return 0;
}