【C语言】qsort函数的使用

👑个人主页:啊Q闻       

🎇收录专栏:《C语言》           

 🎉道阻且长,行则将至

前言 

这篇博客主要是介绍qsort函数的使用,以及利用冒泡排序的方式模拟实现qsort

一.初识qsort函数 

我们可以在qsort - C++ Reference (cplusplus.com)了解到qsort函数,我们发现

void*base是指要排序的数组中的第一个元素,利用void*是因为void*为泛指型指针,所以不论什么类型都可以接收,这也正是qsort函数的一大好处,qsort函数可以实现任意类型函数的排序

size_t num是指数组中的元素个数

size_t size是指指向中的元素的大小

int(*compar)(const void*,const void*)则是需要使用者自己创造一个函数实现数组中元素的大小比较,当返回值大于0时,前者大于后者,当返回值小于0时,前者小于后者,当返回值为0时,前者等于后者。 

 二.利用qsort函数排序

1.使用qsort函数排序整型数据

#include<stdio.h>
int int_cmp(const void* p1, const void* p2)
{return(*(int*)p1 - *(int*)p2);//详解1
}
int main()
{int arr[] = { 1,3,5,6,7,2,4,9,8,0};int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), int_cmp);for (i=0;i<sizeof(arr)/sizeof(arr[0]);i++){printf("%d ", arr[i]);}printf("\n");return 0;}

 详解1:void*的指针不可以直接进行指针的加减整数和解引用的计算,所以在这里我们要强制性转换int*。

2.利用qsort函数排序结构数据 

因为结构体中有不只有一个成员,所以要相同的成员之间比较,因此会有多种比较方法 

#include<stdio.h>
#include<string.h>
struct Stu
{char name[20];int age;
};
int cmp_by_name(const void* p1, const void* p2)//按照名字排序
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p1)->name);
}
int cmp_by_age(const void* p1, const void* p2)//按照年龄排序
{return ((struct Stu*)p1)->age-((struct Stu*)p2)->age;
}
void test2()
{struct Stu s[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_by_name);int i = 0;for (i = 0; i < sizeof(s) / sizeof(s[0]); i++){printf("%s %d  ", s[i].name, s[i].age);}printf("\n");
}
void test3()
{struct Stu s[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_by_age);int i = 0;for (i = 0; i < sizeof(s) / sizeof(s[0]); i++){printf("%s %d  ", s[i].name, s[i].age);}
}
int main()
{test2();test3();return 0;
}

 详解:因为名字为字符串,所以要用strcmp进行比较。

 三.qsort函数的模拟实现

在这里,我们采用冒泡排序的方式实现qsort 。

1.qsort实现整数排序 

#include<stdio.h>
void int_cmp(const void* p1, const void* p2)
{return(*(int*)p1 - *(int*)p2);
}
void Swap(void* p1, void* p2, size_t  size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1+i);*((char*)p1+i) = *((char*)p2+i);*((char*)p2+i) = tmp;}
}
void bubble(void* base, int count, int size, int(*cmp)(const void*, const void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}int main(){int arr[10] = { 1,3,5,2,4,6,9,8,7,0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(arr[0]), int_cmp);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");return 0;}

 

详解:

 

2.qsort实现结构排序 

 结构体排序类似整型排序,代码放在下方:

 #include<stdio.h>
struct Stu
{char name[20];int age;
};
int cmp_by_age(void* p1, void* p2)
{return((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
int cmp_by_name(void* p1, void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
void Swap(void* p1, void* p2, size_t  size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1+i);*((char*)p1+i) = *((char*)p2+i);*((char*)p2+i) = tmp;}
}
void bubble(void* base, int count, int size, int(*cmp)(const void*, const void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}int main(){struct Stu arr[] = { {"zhangsan",18},{"lisi,22"},{"wangwu",11} };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(arr[0]), cmp_by_age);for (i = 0; i < sz; i++){printf("%s %d ",arr[i].name,arr[i].age);}printf("\n");return 0;}

 谢谢你的阅读,如果对你有帮助的,三连么么么 

 

 

 

 

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

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

相关文章

Redis缓存问题详解和处理

缓存更新策略 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案: 缓存空对象 优点: 实现简单, 维护方便缺点: 额外的内存消耗, 可能造成短期的不一致 布隆过滤 优点: 内存占用较少(保存的是数据…

PDF Word Converter V2-一站式文档转换解决方案

PDF Word Converter V2 一站式文档转换解决方案 功能亮点&#xff1a; PDF 转 Word&#xff1a;轻松将 PDF 文档转换为可编辑的 Word 文件&#xff0c;保持原有格式和布局。 Word 转 PDF&#xff1a;将 Word 文档转换为 PDF 格式&#xff0c;确保跨平台的文档一致性和专业呈…

像SpringBoot一样使用Flask - 3.蓝图路由Blueprint

接上一篇文章《像SpringBoot一样使用Flask - 2.静态资源访问及模版》&#xff0c;我们看到测试的"controller"都写在了一起&#x1f914; 如何像Springboot一样划分出一个完整的controller&#xff0c;里面实现不同业务的包呢&#xff1f; 本篇引入Blueprint&#xf…

uniapp图片涂鸦插件(支持多种涂鸦方式,图片放大缩小)

工程地址https://gitee.com/geshijia/ct-graffiti ct-graffiti涂鸦组件使用说明 参考说明 参考链接&#xff1a;https://github.com/ylyuanlu/yl-graffiti 感谢作者的付出&#xff0c;给我提供了一些思路&#xff0c;并做了如下优化&#xff1a; 增加图片放大缩小移动功能添…

数据库基础理论知识

1.基本概念 数据(Data)&#xff1a;数据库存储的基本对象。数字、字符串、图形、图像、音频、视频等数据库(DB)&#xff1a;在计算机内&#xff0c;永久存储、有组织、可共享的数据集合数据库管理系统(DBMS)&#xff1a;管理数据库的系统软件数据库系统(DBS)&#xff1a;DBDBM…

数据结构:红黑树的模拟实现

目录 1、什么是红黑树&#xff1f; 2、红黑树的相关操作与实现 1、节点定义 2、查找操作 3、插入操作 1、cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;cur存在且为红 2、cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在/u存在且为黑 4、判断…

Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器

Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)–稳定高质量文案生成器 1.LangGPT介绍 现有 Prompt 创建方法有如下缺点&#xff1a; 缺乏系统性&#xff1a;大多是细碎的规则&#xff0c;技巧&#xff0c;严重依赖个人经验缺乏灵活性&#xff1a;对他人分享的优质 …

mysql基于mycat实现读写分离

试验环境 基于mysql主从复制已经实现 mycat主机192.168.199.149&#xff0c;安装好java和jdk 数据库主机192.168.199.150 数据库从机192.168.199.151 149配置 下载mycat并解压 vim /root/mycat/conf/server.xml vim /root/mycat/conf/schema.xml 150是主数据库&#xff0…

jenkins部署go应用 基于docker-compose

丢弃旧的的构建 github 拉取代码 指定go的编译版本 安装插件 拉取代码是排除指定的配置文件 比如 conf/config.yaml 文件 填写配置文件内容 比如测试环境一些主机信息 等 可以配置里面 构建的时候选择此文件替换开发提交的配置文件。。。。 编写docker-compose 文件 docker…

CountDownLatch介绍和使用

1. CountDownLatch是什么 CountDownLatch 是 Java.util.concurrent 包中的一个同步工具类&#xff0c;用于控制线程的执行顺序。它的主要作用是让一个或多个线程等待其他线程完成操作后再继续执行。 2. CountDownLatch 类常用方法 CountDownLatch(int count) 是 CountDownLa…

【C++ Boost库】原始计时器

文章目录 前言一、原始计时器1.1 timer定时器timer类的介绍异常安全代码概况 1.2 progress_timer类如何使用异常安全代码概况 1.3 progress_display类如何使用代码概况 总结 前言 在现代软件开发中&#xff0c;时间是一种不可逆转的资源。特别是在需要按时执行任务、调度事件或…

鸿蒙开发月薪过万,背后的秘密~

自从智联招聘公布出春节后首周的岗位需求数据后&#xff0c;鸿蒙开发岗位就被推上了热潮&#xff01;鸿蒙相关职位数同比增长163%&#xff0c;投递人数同比增长349%&#xff0c;即分别增至去年同期的2.6倍、4.5倍&#xff0c;涨势突出。 于是我的朋友圈中就有人去市场中简单探…