还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!


在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《快速入门C语言》《C语言初阶篇》

⛺️生活的理想,就是为了理想的生活!

文章目录

  • 前言
  • 💬 库函数qsort的介绍
    • 💬 库函数qsort的参数介绍
      • 💭 参数一 (void* base)
      • 💭 参数二 (size_t num)
      • 💭 参数三 (size_t size)
      • 💭 参数四 (int (*cmp)(const void*, const void*))
    • 💬(void *)指针讲解
      • 💭 (void* )类型的指针该如何使用
  • 📋 qsort应用实例
    • 💬 qsort应用实例排序整形
    • 💬 qsort应用实例排序字符
    • 💬 qsort应用实例排序结构体
  • 总结

前言

   🌈hello! 各位宝子们大家好啊,刚开始学编程的时候我们都是用冒泡来进行排序的,今天给大家介绍一下新的排序方法库函数qsort!
   ⛳️sor英文原意是排序的意思,而qsort的q是quick的缩写快速的意思!那么库函数qsort的意思就不言而喻了吧?快速排序!
   📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 库函数qsort的介绍

  🌈在介绍库函数qsort之前我们先来回顾下冒泡排序。

  • ⛳️ 有一组整数数据要排为升序,该怎么做?
    • 🌱 用俩俩相邻的元素进行比较
    • 🌱 如果不满足就进行交换,这是冒泡排序的核心思想!
    • 🌱 我们来用代码写一下看看。

📚 代码演示:

#include <stdio.h>
void bubble_sort(int arr[], int sz)
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){//一趟比较//两两相邻元素比较int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

🔥 但是:冒泡排序只能排序整数,像浮点数、字符、结构体都排序不了!

  ⛳️ 而我们的库函数qsort就不一样了,所有数据类型都可以排序这点是不是比冒泡排序强太多了?我们先来看看在C语言官网上qsort的描述。
在这里插入图片描述
大部分人肯看到这个参数可能就会想怎么这么复杂?其实没有什么难的我们来一起看一下慢慢来你就会彻底明白这些是什么意思?

  • 信息一: 在使用qsort之前得先引用他的头文件<stdlib.h>
  • 信息二: 它需要接收4个参数
  • 信息三: 这个库函数没有返回值+++

这就就是我们暂时获得的信息,而我们知道要调用函数得给它传值那么接下来,就来研究一下啊,qsort函数的参数

💬 库函数qsort的参数介绍

在这里插入图片描述

上面是C语言官网上对qsort的四个参数描述,看起来很复杂是吧其实非常简单我们来把函数原型写出来对照一下,看下每个参数的含义是什么:

void qsort(void* base, //指向了需要排序的数组的第一个元素size_t num, //排序的元素个数size_t size,//一个元素的大小,单位是字节int (*cmp)(const void*, const void*)//函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素);

💭 参数一 (void* base)

📑 看下一下官方文档中的参数描述:

  • v o i d ∗ b a s e void* base voidbase 是什么意思:
    在这里插入图片描述

⛳️ 这里说指向要排序的的第一对象的指针转为, void* 空指针类型

  • 其实意思就是我们需要给他传一个
  • 指向要排序的对象的第一个元素的指针
  • 它会自动转换为空指针类型

💭 参数二 (size_t num)

📑 看下一下官方文档中的参数描述:

  • size_t num 是什么意思:
    在这里插入图片描述

⛳️ 这里意思是:base指向的数组空间里元素的个数, size_t 是一个无符号整形的数!

  • 其实意思就是我们需要给他传一个
  • base指向数组空间里元素的个数
  • 它会自动转换为一个无符号整形

🔥 注:我们知道无符号整数没有符号位,所以它永远表示的都是正数。而元素个数也都是正数不能是负数所以这里会转换为size_t类型。

💭 参数三 (size_t size)

📑 看下一下官方文档中的参数描述:

  • size_t size 是什么意思:
    在这里插入图片描述

⛳️ 这里意思是:base指向的数组里每元素的大小, size_t 是一个无符号整形的数!

  • 其实意思就是我们需要给他传一个
  • base指向的数组里每元素的类型大小,是多少字节!
  • 它会自动转换为一个无符号整形

🔥 注:和前面一样,数据类型的大小也永远是正数,所以我们把它转换为size_t类型是不是合适些!

💭 参数四 (int (cmp)(const void, const void*))

📑 看下一下官方文档中的参数描述:

  • (int (cmp)(const void, const void*) 是什么意思:
    在这里插入图片描述

⛳️ 这里意思是:参数四需要一个函数指针类型的参数,做为比较函数传给它!

也就是我们需要自己写一个比较函数然后把地址传给参数四
int compar (const void* p1, const void* p2);

  • 需要的参数是Zvoid* 的类型的大家想
  • 是不是这样就可以接收所有的数据类型了

这个函数需要完成的功能是

  • 指针变量p1 和 指针变量p2 比较。
  • 如果p1<p2就返回小于0的数
  • 如果p1= p2就返回0
  • 如果p1>p2就返回大于0的数

💬(void *)指针讲解

void我们都知道是一个空类型的意思,void 就是无类型的指针 :*

  • 无具体类型的指针,可以说他为通用类型指针
  • 但是这种类型的指针是不能够直接进行解引用操作的
  • 由于类型是空类型所以也不能进行指针运算
  • 因为既然他是个空类型那么我们 + - 是该跳过多少字节呢?

📚示例一:
在这里插入图片描述

  ⛳️这里就就可以看出一旦指针类型不同是不可以接收不同类型的地址的!

  • 而用 void* 类型的指针就不会出现这种情况

📚示例二:
在这里插入图片描述

💭 (void* )类型的指针该如何使用

  ⛳️前面说了这种指针既不能直接解引用,又不能进行指针运算那么我们该怎么使用void*类型的指针呢?

  • 🌱 其实void*类型的指针在使用的时候需要强制转换一下就好了!
  • 🌱 这样这个空指针类型不就有类型了(我们强制转换的类型)
  • 🌱 那么指针的运算不也解决了?因为有类型了就可以知道
  • 🌱 加一步我们可以跳过多少字节

📑图片展示:
在这里插入图片描述

📋 qsort应用实例

💬 qsort应用实例排序整形

  ⛳️好了各位宝子们!前面的知识我们掌握就可以来实践一下这个库函数是不是真的有那么神奇,相信很多人已经迫不及待了吧!

📚 代码演示:

#include <stdio.h>
#include <stdlib.h>
int compar(const void* p1,const void* p2)
{return (*((int*)p1) - *((int*)p2));
}
void print(int* arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[] = { 8,6,9,7,6,1,2,4,5,3,10 };int sz = sizeof(arr) / sizeof(arr[0]);	//排序qsort(arr, sz, sizeof(arr[0]), compar);//打印print(arr, sz);return 0;}

这里我们就进行了整形数组排序,前三个参数很简单就不讲:

  • 第四个参数我们说了,需要一个比较函数的地址传给他
  • 而函数名就是地址,也可以写取地址&加函数名

那么我们就造一个比较函数出来就行

  • 整形刚好用一个数减另一个整形
  • 如果大于0第一个数就大些
  • 小于0就说明第一个参数小些
  • 刚好满足要求!

📑 代码结果:
在这里插入图片描述

💬 qsort应用实例排序字符

  ⛳️同理字符前面三个参数也一样就比较函数需要改动,而字符的比较直接用strcmp这个函数就可以了!

📚 代码演示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compar(const void* p1,const void* p2)
{return strcmp((char*)p1,(char*)p2);
}
void print(char* arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%c ", arr[i]);}
}
int main()
{char arr[] = { 'c','a','f','d','B','A','C','D'};int sz = sizeof(arr) / sizeof(arr[0]);	//排序qsort(arr, sz, sizeof(arr[0]), compar);//打印print(arr, sz);return 0;}

📑 代码结果:

在这里插入图片描述

💬 qsort应用实例排序结构体

  ⛳️同理字符前面三个参数也一样就比较函数需要改动,而字符的比较直接用strcmp这个函数就可以了!

  • 这里几不给大家打印出来看了,给大家看一下监视就可以看出来是否排序了

📚 代码演示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{char  arr[20];int	  age;
};
int compar_by_age(const void* p1,const void* p2)
{return (((struct Stu*)p1)->age-((struct Stu*)p2)->age);
}int main()
{struct Stu  arr[] = { {"zhangsan",30},{"lisi",70},{"wangwu",10} };int sz = sizeof(arr) / sizeof(arr[0]);	//排序qsort(arr, sz, sizeof(arr[0]), compar_by_age);return 0;}

📑 代码结果:
在这里插入图片描述

总结

✅ 归纳:
好了以上就是关于 库函数 qsort 快速排序函数 的用法就全部讲解完毕啦!
  库函数 qsort的介绍
  库函数 qsort 参数一
  库函数 qsort 参数二
  库函数 qsort参数三
  库函数 qsort参数四
  库函数 qsort的应用
☁️ 把本章的内容全部掌握,铁汁们就可以熟练应用qsort排序各种各样的数据啦!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

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

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

相关文章

Unity游戏源码分享-迷你高尔夫球游戏MiniGolfConstructionKitv1.1

Unity游戏源码分享-迷你高尔夫球游戏MiniGolfConstructionKitv1.1 有多个游戏关卡 工程地址&#xff1a;https://download.csdn.net/download/Highning0007/88052881

保荐人“临阵脱逃”,上市折戟的汉王药业问题出在哪?

撰稿|行星 来源|贝多财经 近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;因陕西汉王药业股份有限公司&#xff08;以下简称“汉王药业”&#xff09;的保荐人兴业证券申请撤销保荐&#xff0c;上海证券交易所终止了对其在主板上市的审核。 据贝多财经了解&#x…

Java springBoot项目报LDAP health check failed

报错内容如下&#xff1a; 在bootstrap.yml文件里加 management:health:ldap:enabled: false 配置。 或者在application.properties文件里加&#xff1a; management.health.ldap.enabledfalse 参考答案&#xff1a;LDAP health check failed 难道没有人遇到这样的问题吗&…

论文--高通量田间植物表型:一种用于分割重叠植物的自监督序列CNN方法

Title: High-Throughput Field Plant Phenotyping: A Self-Supervised Sequential CNN Method to Segment Overlapping Plants Abstract: High-throughput plant phenotyping—the use of imaging and remote sensing to record plant growth dynamics—is becoming more wide…

【岛屿最大面积】BJ某IT厂笔试题

该题在LeetCode上能找到原题&#xff0c;大致意思是&#xff0c;给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&…

《MySQL》事务

文章目录 概念事务的操作属性&#xff08;aicd&#xff09; 概念 一组DML语句&#xff0c;这组语句要一次性执行完毕&#xff0c;是一个整体 为什么要有事务&#xff1f; 为应用层提供便捷服务 事务的操作 有一stu表 # 查看事务提交方式(默认是开启的) show variables like au…

uniapp调接口出现跨域问题。

今天在写uniapp项目的时候&#xff0c;使用在线模拟接口的时候&#xff0c;出现跨域问题。 【问题描述】&#xff1a; ①在内嵌浏览器运行&#xff0c;不会出现跨域问题&#xff0c;好像是内嵌浏览器自动去掉了跨域问题。 ②在外部浏览器调用的时候会出现跨域问题。&#xf…

深入理解Spring事务传播机制-原理与实例说明

事务传播机制 简化记忆版本 REQUIRED:有事务加入&#xff0c;没有事务创建&#xff0c;Spring默认MANDATORY:必须在事务中被调用&#xff0c;没有抛异常SUPPORTS:有事务加入&#xff0c;没有以非事务运行NOT_SUPPORTED:不需要事务&#xff0c;有事务则挂起&#xff0c;避免回…

黑马头条 分布式任务调度 定时计算热点文章、xxl-job、kafkaStream

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 1.2 …

## 流体力学或湍流理论中壁函数(wall function)

流体力学或湍流理论中壁函数&#xff08;wall function&#xff09; 一、壁函数&#xff08;wall function&#xff09;概念 在流体力学或湍流理论中&#xff0c;壁函数是基于壁定律得到的无量纲速度 u u^ u与无量纲壁距 y y^ y之间的函数关系。 在对数层区域&#xff0c;速…

WooCommerce适合企业电子商务吗?

目录 成功开展电子商务业务变得比以往任何时候都容易。市场上有几个现成的平台&#xff0c;完全有可能将一个初步的想法快速转变为在线贸易业务&#xff0c;并源源不断地收到订单。 什么是 WooCommerce&#xff1f; 为什么您应该考虑使用 WooCommerce 很灵活 重量轻且功…

Sentinel 规则详解

Sentinel 规则 流控规则 flow1、QPS流控2、并发线程数流控3、流控模式4、流控效果 熔断&#xff08;降级&#xff09;规则 degrade1、慢调用比例2、异常比例3、异常数 热点规则 param-flow授权规则 authority1、应用场景2、自定义来源3、授权规则配置 系统规则 前言&#xff1a…