C语言的标准库提供了一个重要的排序函数qsort给C语言使用者使用,qsort函数将快速排序的算法封装起来,这篇文章主要给大家介绍了关于C语言中qsort函数的介绍与用法的相关资料,需要的朋友可以参考下
一.qsort函数是什么
我们可以使用 搜索库函数网址或者MSDN软件进行查找。
qsort()函数:快速排序的函数 -引用stdlib.h头文件
参数说明:
void qsort ( void* base, //要排序的目标数组 size_t num, //待排序的元素个数 size_t width, //一个元素的大小,单位是字节 int(*cmp)(const void* e1, const void* e2) );
其中cmp是函数指针,cmp指向的是:排序时,用来比较两个元素的函数。需要自己编写。
返回值:
二.使用qsort排序-以升序为例
关于void*型指针:
void*:无具体类型的指针 能够接收任意类型的地址
缺点:不能进行运算。不能+-整数,不能解引用
int a = 0; float f = 5.5f; void* p1 = &a; void* p2 = &f; p1 = p1+1; //err
1.整形数组排序
注意:
1.比较函数的参数类型为void* ,我们要进行强制类型转换!且要解引用才能得到对应的值!
2.若我们想排成降序,只需要写成e2-e1即可
void Print(int* arr, int sz) { int i = 0; for (i = 0; i
2.字符数组排序
注意使用sizeof()操作符和strlen()函数的区别
//注意要要强制类型转换!! 要解引用!!! 本质上是比较Ascii值 int cmp_char(const void* e1, const void* e2) { return *(char*)e1 - *(char*)e2; } void test4() { char arr[] ="mango"; //若使用sizeof计算长度: //int sz = sizeof(arr) / sizeof(arr[0]); //6 //qsort(arr, sz-1, sizeof(arr[0]), cmp_float); //因为sizeof把\0也算进去了,所以计算出来的值比字符串本身长度多1 int sz = strlen(arr); //5 qsort(arr, sz, sizeof(arr[0]), cmp_char); printf("%s\n",arr); }
3.字符指针数组排序
先看看下面这段程序有没有问题?
int cmp_chars(const void* e1, const void* e2) { return strcmp((char*)e1, *(char*)e2); } void test2() { char* arr1 = "abc"; char* arr2 = "wcad"; char* arr3 = "cab"; char* p[3] = { arr1,arr2,arr3 }; int sz = sizeof(p) / sizeof(p[0]); qsort(p, sz, sizeof(p[0]), cmp_chars); int i = 0; for (i = 0; i
打印出来发现:结果是错误的!
->调试后发现:e2存放的是p的地址(char**类型),e1存放的是p指向的下一个元素的地址(char**类型)
对于这种写法,传进去的是p的地址,strcmp()会将p地址对应的内容转化成字符串,也就是将p中arr1,arr2,arr3的地址转化成字符串
实际上应该传p地址空间中arr1,arr2的地址,这样strcmp()才能找到arr1和arr2对应的字符串,因此得先把e1,e2转化成char**,这样解引用以后才是一个char*的地址
原因:把p传给qsort,p是数组名->首元素地址,元素类型为char*>,所以p的类型为:char**类型。 所以e1 和e2也要强制类型转化为char**,解引用e1,e2才是对应字符串的地址!
正解:
int cmp_chars(const void* e1, const void* e2) { return strcmp(*(char**)e1, *(char**)e2); } void test2() { char* arr1 = "abc"; char* arr2 = "wcad"; char* arr3 = "cab"; char* p[3] = { arr1,arr2,arr3 }; int sz = sizeof(p) / sizeof(p[0]); qsort(p, sz, sizeof(p[0]), cmp_chars); int i = 0; for (i = 0; i
4.结构体数组排序
比较年龄->实际比较的是整形
比较名字->实际比较的是字符串->使用strcmp函数,不能使用 == 判断
struct Stu { int age; char name[20]; }; //比较结构体中元素的年龄 int cmp_age(const void* e1, const void* e2) { //本质是比较整形 return ((struct Stu*)e1)->age - ((struct Stu*)e2)-以上就是C语言中qsort函数的介绍与用法实例的详细内容,更多请关注0133技术站其它相关文章!