作者:懒懒加菲猫爱小狐狸 | 来源:互联网 | 2024-12-08 15:45
qsort函数是C标准库中用于排序的一个强大工具,它能够对任意类型的数据进行排序。该函数接受四个参数:
- 第一个参数是指向待排序数组的指针。
- 第二个参数是数组中元素的数量。
- 第三个参数是每个元素的大小,通常通过sizeof操作符获取。
- 第四个参数是一个指向比较函数的指针,这个函数决定了排序的规则。
前三个参数相对直观,而最后一个参数——比较函数,则是实现特定排序逻辑的关键所在。
基本示例:整数数组的qsort排序
从大到小排序
#include
int cmp_desc(const void *a, const void *b) {
return (*(int*)b - *(int*)a);
}
// 使用qsort函数进行排序
qsort(arr, n, sizeof(int), cmp_desc);
从小到大排序
#include
int cmp_asc(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
// 使用qsort函数进行排序
qsort(arr, n, sizeof(int), cmp_asc);
七种qsort排序方法
1. 对int类型数组排序
int arr[100];
int cmp_int(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
qsort(arr, n, sizeof(int), cmp_int);
2. 对char类型数组排序(与int类型类似)
char arr[100];
int cmp_char(const void *a, const void *b) {
return (*(char*)a - *(char*)b);
}
qsort(arr, n, sizeof(char), cmp_char);
3. 对double类型数组排序
double arr[100];
int cmp_double(const void *a, const void *b) {
return (*(double*)a > *(double*)b) ? 1 : -1;
}
qsort(arr, n, sizeof(double), cmp_double);
4. 对结构体进行一级排序
struct Item {
double value;
int other;
} items[100];
int cmp_item(const void *a, const void *b) {
return ((*(struct Item*)a).value > (*(struct Item*)b).value) ? 1 : -1;
}
qsort(items, n, sizeof(struct Item), cmp_item);
5. 对结构体进行二级排序
struct Item {
int x;
int y;
} items[100];
int cmp_item2(const void *a, const void *b) {
struct Item *ia = (struct Item*)a;
struct Item *ib = (struct Item*)b;
if (ia->x != ib->x)
return ia->x - ib->x;
else
return ib->y - ia->y;
}
qsort(items, n, sizeof(struct Item), cmp_item2);
6. 对结构体进行三级排序(均按升序)
typedef struct {
int num;
int length;
int width;
} Item;
int cmp_item3(const void *a, const void *b) {
Item *ia = (Item*)a;
Item *ib = (Item*)b;
if (ia->num != ib->num)
return ia->num - ib->num;
else if (ia->length != ib->length)
return ia->length - ib->length;
else
return ia->width - ib->width;
}
qsort(items, n, sizeof(Item), cmp_item3);
7. 对字符串进行排序
struct Item {
int data;
char str[100];
} items[100];
int cmp_str(const void *a, const void *b) {
return strcmp(((struct Item*)a)->str, ((struct Item*)b)->str);
}
qsort(items, n, sizeof(struct Item), cmp_str);
8. 计算几何中求凸包的cmp函数
struct Point {
int x;
int y;
};
int cmp_convex_hull(const void *a, const void *b) {
struct Point *pa = (struct Point*)a;
struct Point *pb = (struct Point*)b;
if (calc(*pa, *pb, p[1]) <0)
return 1;
else if (!calc(*pa, *pb, p[1]) && dis(pa->x, pa->y, p[1].x, p[1].y) x, pb->y, p[1].x, p[1].y))
return 1;
else
return -1;
}
qsort(points, n, sizeof(struct Point), cmp_convex_hull);