C库函数_qsort( )
qsort
是stdlib.h
中的函数,因此使用前需要声明:
#include <stdlib.h>
qsort
的函数声明如下:
void qsort(void *base, size_t nitems,size_t size, int (* compar)(const void *, const void *));
格式
qsort
包含四个参数,分别是:
- 数组名
- 元素个数(从前往后计算)
- 数组元素所占字节
- 排序原则(递增递减奇偶交叉等)
int cmp(const void *a,const void *b) {
return *(int*)a-*(int*)b;
}
qsort(num, n, sizeof(int), cmp);
第四个cmp
是比较函数指针,通过cmp
返回的参数来确定排序规则,其中cmp
函数的参数const void *a,const void *b
表示a
和b
的类型是未确定的,再return
中强制转换成int
类型,其中*(int*)a-*(int*)b
表示递增顺序,递减就是将a
和b
换位
不同类型的排序
-
整型
int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b; }
-
浮点数
int cmp(const void *a,const void *b){ return *(double*)a>*(double*)b?1:-1; }
-
字符(char)
int cmp(const void *a,const void *b){ return *(char*)a-*(char*)b; }
-
结构体
struct node{ int i; double j; char k; } int cmp(const void *a,const void *b){ return *(*(node*)a).i-*(*(node)b).i; }
下面是一段使用qsort()
函数的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
struct MyStruct {
int i;
double j;
char k;
};
// 比较函数 for int
int compare_int(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
// 比较函数 for double
int compare_double(const void *a, const void *b) {
double diff = (*(double *)a - *(double *)b);
if (diff > 0) return 1;
if (diff < 0) return -1;
return 0;
}
// 比较函数 for char
int compare_char(const void *a, const void *b) {
return (*(char *)a - *(char *)b);
}
// 比较函数 for struct (按 i 排序)
int compare_struct(const void *a, const void *b) {
return ((struct MyStruct *)a)->i - ((struct MyStruct *)b)->i;
}
int main() {
// 示例数据
int int_array[] = {5, 2, 9, 1, 5, 6};
double double_array[] = {3.2, 1.5, 4.8, 1.2, 5.7};
char char_array[] = {'d', 'a', 'c', 'b', 'e'};
struct MyStruct struct_array[] = {
{3, 2.5, 'a'},
{1, 3.2, 'b'},
{4, 1.1, 'c'},
{2, 4.4, 'd'}
};
// 计算数组长度
int int_len = sizeof(int_array) / sizeof(int_array[0]);
int double_len = sizeof(double_array) / sizeof(double_array[0]);
int char_len = sizeof(char_array) / sizeof(char_array[0]);
int struct_len = sizeof(struct_array) / sizeof(struct_array[0]);
// 对 int 数组进行排序
qsort(int_array, int_len, sizeof(int), compare_int);
printf("Sorted int array: ");
for (int i = 0; i < int_len; i++) {
printf("%d ", int_array[i]);
}
printf("\n");
// 对 double 数组进行排序
qsort(double_array, double_len, sizeof(double), compare_double);
printf("Sorted double array: ");
for (int i = 0; i < double_len; i++) {
printf("%.2f ", double_array[i]);
}
printf("\n");
// 对 char 数组进行排序
qsort(char_array, char_len, sizeof(char), compare_char);
printf("Sorted char array: ");
for (int i = 0; i < char_len; i++) {
printf("%c ", char_array[i]);
}
printf("\n");
// 对结构体数组进行排序
qsort(struct_array, struct_len, sizeof(struct MyStruct), compare_struct);
printf("Sorted struct array (by i): ");
for (int i = 0; i < struct_len; i++) {
printf("(%d, %.2f, %c) ", struct_array[i].i, struct_array[i].j, struct_array[i].k);
}
printf("\n");
return 0;
}