qsort函数用法详细版,转载,博主写的很详细

排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

  功能: 使用快速排序例程进行排序

  头文件:stdlib.h

  用法: void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

  参数: 1 待排序数组,排序之后的结果仍放在这个数组中

      2 数组中待排序元素数量

     3 各元素的占用空间大小(单位为字节)

   4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)

  qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

  如比较函数 int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。

qsort中几种常见的比较函数cmp

一、对int型数组排序

int num[100];

int cmp_int(const void* _a , const void* _b)  //参数格式固定

{

int* a = (int*)_a; //强制类型转换

int* b = (int*)_b;

return *a - *b;  

}

qsort(num,100,sizeof(num[0]),cmp_int);

  可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

二、对char型数组排序(同int类型)

char word[100];

int cmp_char(const void* _a , const void* _b)  //参数格式固定

{

char* a = (char*)_a; //强制类型转换

char* b = (char*)_b;

return *a - *b;  

}

qsort(word,100,sizeof(word[0]),cmp_char);

三、对double型数组排序

double in[100];

int cmp_double(const void* _a , const void* _b)  //参数格式固定

{

double* a = (double*)_a; //强制类型转换

double* b = (double*)_b;

return *a > *b ? 1 : -1;  //特别注意

}

qsort(in,100,sizeof(in[0]),cmp_double);

  在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

四、对字符串进行排序

char word[100][10];

int cmp_string(const void* _a , const void* _b)  //参数格式固定

{

char* a = (char*)_a;  //强制类型转换

char* b = (char*)_b;

return strcmp(a,b);

}

qsort(word,100,sizeof(word[0]),cmp_string);

————————————————

版权声明:本文为CSDN博主「zhao888789」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhao888789/article/details/79186619

全部评论

相关推荐

03-31 14:46
已编辑
门头沟学院 Web前端
励志成为双港第一ja...:这其实很正常,离的太远了,他认为你不会来,就为了混个面试,而且成本很高,实习生都优先选本地高校。吃了地域的亏,所有很多时候地域可能比院校层次更重要。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
04-30 17:45
本人简历上 1 个 RAG 项目 + 1 个 Agent demo;这次面的是AI岗一面前我以为:背完八股 + 把项目讲清楚,应该能稳过。0-5 min:自我介绍 + 项目背景- 顺利。讲清楚了我的 RAG 是给法律咨询场景做的,痛点是大模型不懂行业术语。5-20 min:项目深挖(开始崩)- Q1:你的法律文档总共多少?切了多少个 chunk?- 我:约 500 份 PDF,5 万个 chunk- Q2:500 份 PDF 加起来才 5 万 chunk?平均每份 100 个 chunk,你切片粒度是多少?- 我:512 token- Q3:法律文档里"第三条第二款"和"第三条之二"是不同含义,你的切片会不会把它切散?- 我:(沉默 5 秒)……应该会- Q4:那你怎么解决?- 我:我可以加一个 metadata……(开始编)❌ 第一次崩:切片粒度没考虑业务语义。20-35 min:评测体系(继续崩)- Q:你怎么知道你的 RAG 有效?- 我:我用 Recall@5……- Q:评测集多少条?怎么构造的?- 我:100 条,我手工标注的- Q:100 条够吗?分布怎么样?- 我:分布……我没分- Q:那你的 Recall@5 是 0.81,你怎么知道这个数字是好是坏?baseline 是什么?- 我:(沉默 10 秒)❌ 第二次崩:没有 baseline,没分布分析,纯靠"看起来还行"。35-55 min:Agent 部分(彻底崩)- Q:你的 Agent demo 用了几个工具?- 我:3 个,搜索、计算器、文档查询- Q:当用户问一个问题,你的 Agent 怎么决定调哪个工具?- 我:用 ReAct,让模型自己决定- Q:模型决策错了怎么办?- 我:我加了个 reflection……- Q:reflection 失败 3 次后怎么处理?- 我:(沉默 15 秒)……我没想过❌ 第三次崩:异常路径完全没设计。55-65 min:业务理解 + 反问- Q:你觉得字节做 AI 应用最大的瓶颈是什么?- 我:算力?数据?- Q:你看过哪些字节最近发的 AI 产品?- 我:豆包、扣子……- Q:扣子是 Agent 平台还是工作流平台?- 我:(再次沉默)❌ 第四次崩:对面试公司业务一无所知。
面试官拷打AI项目都会问...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务