C语言中qsort函数的介绍与用法实例

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技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言