C语言-qsort的使用

1. qsort()函数简介

qsort()函数是C语言库函数中的一种排序函数,排序方法为快速排序(quick sort) 。
其特点是可以排序任意类型的数组元素。

1.1 函数原型

void qsort(void* base, size_t num, size_t size, int (*comparator)(const void* elem1, const void* elem2));
需引用头文件:<stdlib.h>或<search.h>

1.2 函数参数 

qsort()函数需要四个参数
1. void* base:  需排序数组首元素
2. size_t num: 数组元素个数
3. size_t size: 一个数组元素大小(byte)
4. int (*comparator) (const void* elem1 , const void* elem2):  是一个函数指针,其指向的是一个比较函数的地址,该函数有两个void* 的参数,其返回类型为int 。

 void* 类型指针:可以接收任意类型的地址,但不能进行解引用操作和不能对其进行加减整数的操作。

2. 比较函数简介

2. 1 比较函数参数 

比较函数为自定义函数:其两个参数为void*类型指针的elem1和elem2 ,返回参数为整形int
参数类型为void*原因:不清楚需比较元素的类型是什么,所以通过void*类型指针的特点(可以接收任意类型的地址)来接收。const修饰其两个比较参数不可被更改。

 返回值有三种情况:

  < 0 : elem1 小于 elem2

 = 0 : elem1 等于 elem2

 > 0 : elem1 大于 elem2

2.2 比较函数使用

如需使用比较函数而void*类型指针不能解引用操作和加减整数操作我们只需对两个元素进行强制类型转换为我们想比较元素的类型指针,再进行解引用获取两个元素的值,最后进行两个元素的差值返回。

整型数组

int comp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}

字符数组

int comp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

浮点型数组

int comp_double(const void* elem1, const void* elem2)
{return (int)(*(double*)elem1 - *(double*)elem2);
//浮点型差值为浮点型,而返回值需要为int型,避免报错将差值强制类型转换为int型
}

字符串

按首字母排序

int comp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

按字符串长度排序

int comp_string(const void* elem1, const void* elem2)
{if (strlen(*(char*)elem1) > strlen(*(char*)elem2)){return 1;}else if (strlen(*(char*)elem1) < strlen(*(char*)elem2)){return -1;}else{return 0;}
}

按正常排序

int comp_string(const void* elem1, const void* elem2)
{return strcmp(*(char*)elem1, *(char*)elem2);//strcmp比较两个字符串大小
}

结构体

struct stu
{char name[20];int grade;
};

对学生姓名排序

int comp_string(const void* elem1, const void* elem2)
{return strcmp(((str*)elem1)->name, ((str*)elem2)->name);
}

对学生成绩排序

int comp_string(const void* elem1, const void* elem2)
{return strcmp(((str*)elem1)->grade, ((str*)elem2)->grade);
}

3. qsort()函数使用 

3.1 整形数组排序

int cmp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}
int main()
{int arr[] = { 2,4,6,8,10,1,3,5,9,7 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;qsort(arr, sz, sizeof(arr[0]), cmp_int);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

 3.2 字符数组排序

int cmp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
int main()
{char ch[] = {'b','c','a','e','f','d','g'};int sz = sizeof(ch) / sizeof(ch[0]);int i = 0;qsort(ch, sz, sizeof(ch[0]), cmp_char);for (i = 0; i < sz; i++){printf("%c ", ch[i]);}return 0;
}

3.3 浮点型数组排序(double类型为例)

int cmp_double(const void* elem1, const void* elem2)
{return (int)(*(double*)elem1 - *(double*)elem2);
}
int main()
{double arr[] = {2.5,1.0,3.5,4.5,2.0};int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;qsort(arr, sz, sizeof(arr[0]), cmp_double);for (i = 0; i < sz; i++){printf("%f ", arr[i]);}return 0;
}

3.4 字符串数组排序 

按字符串首字母排序

int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
int main()
{char ch[5][10] = { "black","cat","apple","face","dog" };int sz = sizeof(ch) / sizeof(ch[0]);int i = 0;qsort(ch, sz, sizeof(ch[0]), cmp_string);for (i = 0; i < sz; i++){printf("%s ", ch[i]);}return 0;
}

 按正常排序

int cmp_string(const void* elem1, const void* elem2)
{return strcmp((char*)elem1,(char*)elem2);
}
int main()
{char ch[5][10] = { "aaa","a","aaaaa","aa","aaaa" };int sz = sizeof(ch) / sizeof(ch[0]);int i = 0;qsort(ch, sz, sizeof(ch[0]), cmp_string);for (i = 0; i < sz; i++){printf("%s ", ch[i]);}return 0;
}

3.5 结构体 

typedef struct Stu
{char name[20];int age;
}Stu;
int cmp_str(const void* elem1, const void* elem2)
{return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}int main()
{Stu s[] = { {"张三",18},{"李四",19},{"王五",20} };int sz = sizeof(s) / sizeof(s[0]);int i = 0;qsort(s, sz, sizeof(s[0]), cmp_str);for (i = 0; i < sz; i++){printf("%s %d\n", s[i].name, s[i].age);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433877.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 之LeetCode刷题记录(二十)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二…

CMU15-445 Project0

CMU14445 Task #1 - Copy-On-Write Trie Get()思路&#xff1a; 获取根节点指针&#xff0c;顺着key逐字符往下找节点&#xff0c;最后根据题意可以使用dynamic_cast检查是否是TrieNodeWithValue&#xff08;dynamic_pointer_cast也可以)&#xff0c;以下为两者用法&#xff1…

签到业务流程

1.技术选型 Redis主写入查询&#xff0c;Mysql辅助查询&#xff0c;传统签到多数都是直接采用mysql为存储DB,在大数据的情况下数据库的压力较大.查询速率也会随着数据量增大而增加.所以在需求定稿以后查阅了很多签到实现方式,发现用redis做签到会有很大的优势.本功能主要用到r…

字节8年经验之谈 —— 如何编写出色的接口测试用例?

简介&#xff1a;在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在修改功能逻辑的时候有回归的能力&#xff0c;同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原…

项目中日历管理学习使用

一些项目中会有日历或日期设置&#xff0c;最基本的会显示工作日&#xff0c;休息日&#xff0c;节假日等等&#xff0c;下面就是基于项目中的日历管理功能&#xff0c;要显示工作日&#xff0c;休息日&#xff0c;节假日 效果图 获取国家法定节假日工具类 public class Holi…

Go语言grpc服务开发——Protocol Buffer

文章目录 一、Protocol Buffer简介二、Protocol Buffer编译器安装三、proto3语言指南四、序列化与反序列化五、引入grpc-gateway1、插件安装2、定义proto文件3、生成go文件4、实现Service服务5、gRPC服务启动方法6、gateway服务启动方法7、main函数启动8、验证 相关参考链接&am…

msvcp140.dll丢失的解决方法

当你在尝试打开一个需要msvcp140.dll文件支持的程序或游戏时&#xff0c;如果系统提示该文件丢失&#xff0c;那么意味着在执行过程中缺少了这个关键的DLL文件。当系统无法找到或加载msvcp140.dll文件时&#xff0c;相应的程序将无法正常启动&#xff0c;这对于用户来说可能会非…

上位机图像处理和嵌入式模块部署(python opencv)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了qt&#xff0c;谈到了opencv&#xff0c;也谈到了嵌入式&#xff0c;但是没有说明python在这个过程当中应该扮演什么样的角色。open…

mac滚动截图

参考博客 https://www.zhihu.com/question/313673726/answer/2938671835 首先去AppStore搜索 iShot 这个也是要钱的&#xff0c;不过我输入appleID后&#xff0c;并没有扣我钱&#xff0c;不知道设么回事 然后打开iShot 点击观看视频&#xff0c;然后mac会自动打开一个新的…

JVM-字节码应用

一、字节码的应用远超你的想象 二、ASM介绍与读取字节码实战 用CoreAPI解析和TreeAPI都能做字节码解析&#xff0c;区别&#xff0c;TreeAPI必须读取完整字节码信息&#xff0c;才能做解析。 下面代码&#xff0c;使用CoreAPI做解析&#xff1a; package asm;public class MyM…

拦截器的简单使用

拦截器的简单使用 拦截器的使用创建拦截器preHandle 目标方法执行前执行postHandle 目标方法执行后执行afterCompletion 视图渲染后执行 拦截器使用场景返回值注册拦截器运用拦截器 拦截器的使用 创建拦截器 首先,我们需要创建一个拦截器器的类,并且需要继承自HandlerIntercep…

DEM高程地形瓦片数据Cesium使用教程

一、简介 从开始写文章到现在&#xff0c;陆续发布了全球90m、30m(包括哥白尼及ALOS)、12.5m全球级瓦片数据&#xff0c;以及中国12.5、日本10m、新西兰8m、等国家级瓦片数据&#xff0c;同时也发布了台湾20m、中国34省区12.5m等地区级瓦片数据。在数据发布的文章中对数据如何…