• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c语言 搞代码 4年前 (2022-01-06) 69次浏览 已收录 0个评论
文章目录[隐藏]

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 <sz; i++) { printf("%d ", *(arr + i)); } printf("\n"); } //比较整形 //注意类型时void* 所以要强制类型转化,还要解引用才是对应的值!!! int cmp_int(const void* e1, const void*<p style="color:transparent">来源gao!%daima.com搞$代*!码网</p> e2) { return *(int*)e1 - *(int*)e2; } void test1() { int arr[] = { 9,8,7,6,7,5,4,8 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int); Print(arr, sz); }

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 <sz; i++) { printf("%s\n", p[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 <sz; i++) { printf("%s\n", p[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函数的介绍与用法实例的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C语言中qsort函数的介绍与用法实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址