我们想对一个数组进行排序时,会用到什么方法呢?冒泡排序?插入排序?快速排序...?
不管我们用哪个都需要我们进行复杂的编码,其实C语言库里就有相关的排序函数,就是我们接下来要介绍的qsort函数,它可以实现对 整形数组,字符数组,结构体,等等进行排序,它里面的内部排序规则其实就是我们熟悉的 快速排序 方法。
就让我们一起学习这个函数吧!!!
qsort是stdlib.h中的函数,因此使用前需要声明:
#include
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
qsort包括四个参数分别是:
1. 数组明(数组首元素地址) void * base
2. 数组的长度 size_t num
3. 数组中元素的字节大小 size_t size
4. 排序原则 int (*compar)(const void*,const void*));
参数是一个函数指针,指向一个函数,这个函数可以比较两个元素的大小
指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素,进行两者之间的大小比较。
将两个指针作为参数(都转换为常量 void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:
1. 返回值 < 0 时,先指向的元素在后指向的元素之前
2. 返回值 = 0 时,先指向的元素等于后指向的元素
3. 返回值 0> 时,先指向的元素在手指向的元素之后
因为p1,和p2是void类型指针,所以我们对整形排序时,就把p1,p2强制转换成(int*),然后在解引用,用p1,减去p2,就是从小到大的排序。
#include
#include
//qsort函数的使用者提供这个比较函数
int cmp_int(const void* p1, const void* p2)//void* - 无具体类型指针,所以它可以接收任意类型的地址
{
return *(int*)p1 - *(int*)p2;
}
void print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//使用qsort来排序整型数组,这里就要提供一个比较函数,这个比较函数能够比较2个整数的大小
//qsort 默认是排成升序的
qsort(arr, sz, sizeof(arr[0]), cmp_int);
print_arr(arr, sz);
}
int main()
{
test1();
return 0;
}
struct Stu
{
char name[20];
int age;
};
同样我们需要把p1,p2强制转换成我们要排序目标的类型,这里就是结构体类型,所以我们p1,p2强制转换成(struct Stu*),然后在用(struct Stu*)指向age。
#include
#include
#include
//qsort 排序结构体数据
struct Stu
{
char name[20];
int age;
};
//按照年龄来比较
int cmp_stu_by_age(const void* p1, const void* p2)
{
return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
void test3()
{
struct Stu s[] = { {"zhangsan",30},{"lisi",25},{"wangwu",50}};
int sz = sizeof(s) / sizeof(s[0]);
//测试按照年龄来排序
qsort(s,sz,sizeof(s[0]),cmp_stu_by_age);
}
int main()
{
test3();
return 0;
}
姓名排序也就是字符串排序,字符串比较大小我们可以用到strcmp函数。
#include
#include
#include
//qsort 排序结构体数据
struct Stu
{
char name[20];
int age;
};
//按照名字来比较
int cmp_stu_by_name(const void* p1, const void* p2)
{
return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name);
}
void test3()
{
struct Stu s[] = { {"zhangsan",30},{"lisi",25},{"wangwu",50}};
int sz = sizeof(s) / sizeof(s[0]);
//测试按照名字来排序
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
test3();
return 0;
}
C语言的深度解剖 qsort() 函数,博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。欢迎在评论区指点江山!!!