【C语言进阶篇】快排函数 qsort 详细解析

这篇具有很好参考价值的文章主要介绍了【C语言进阶篇】快排函数 qsort 详细解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!

前言

   🌈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的描述。
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言
大部分人肯看到这个参数可能就会想怎么这么复杂?其实没有什么难的我们来一起看一下慢慢来你就会彻底明白这些是什么意思?

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

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

💬 库函数qsort的参数介绍

【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

上面是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 是什么意思:
    【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

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

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

💭 参数二 (size_t num)

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

  • size_t num 是什么意思:
    【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

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

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

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

💭 参数三 (size_t size)

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

  • size_t size 是什么意思:
    【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

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

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

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

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

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

  • (int (cmp)(const void, const void*) 是什么意思:
    【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

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

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

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

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

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

💬(void *)指针讲解

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

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

📚示例一:
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

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

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

📚示例二:
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

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

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

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

📑图片展示:
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

📋 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就说明第一个参数小些
  • 刚好满足要求!

📑 代码结果:
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

💬 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;
	
}

📑 代码结果:

【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

💬 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;
	
}

📑 代码结果:
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言

总结

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

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
【C语言进阶篇】快排函数 qsort 详细解析,《C语言进阶篇》,算法,排序算法,开发语言,c语言文章来源地址https://www.toymoban.com/news/detail-628838.html

到了这里,关于【C语言进阶篇】快排函数 qsort 详细解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言 快速排序——qsort函数详解

            我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序。         为了解决这些问题!就使用 qsort函数 吧! 目录 一、qsort函数使用方法 二、qsort函数使用示例      1.数组排序      2.字符数组排序  

    2024年02月03日
    浏览(51)
  • 【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        在这一篇博客中,我们要认识并理解 函数指

    2024年02月09日
    浏览(46)
  • 『C语言进阶』qsort函数及模拟实现

    🔥 博客主页 : 小羊失眠啦 🔖 系列专栏 : C语言 🌥️ 每日语录 : 没有退路,只能让自己变得强大 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 在上篇指针进阶中,我们对函数指针、函数指针数组、函数指针数组指针以及回调函数有了一定的了解,文章末尾简单的对qsort函数进

    2024年02月07日
    浏览(43)
  • C语言标准库函数qsort( )——数据排序

       大家好!我是保护小周ღ,本期为大家带来的是深度解剖C语言标准库函数 qsort(), qsort()函数他可以对 任意类型 的数据排序, 博主会详细解释函数使用方法,以及使用快速排序的左右指针法模拟实现函数功能 , 这样的排序确定不来学习一下吗???   目录 一、qsort()函

    2024年02月03日
    浏览(41)
  • 排序之玩转qsort函数——【C语言】

    说起排序,我们会想起许多算法,在之前的博客中我也写到过,比如:冒泡排序法、快速排序法、选择排序法等等。其实在C语言中一直有一个可以将数组中的内容进行排序的函数且功能完善内容齐全的库函数——qsort函数。今天就让我们来探索一下吧! 目录 回调函数 初始

    2024年02月13日
    浏览(47)
  • 【C语言】qsort()函数详解:能给万物排序的神奇函数

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022   目录 一.qsort()函数的基本信息及功能 二.常见的排序算法及冒泡排序 三.逐一解读qsort()函数的参数及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(const void*,const void*) 四.使用qsort()函数完成整形,

    2024年02月06日
    浏览(48)
  • C语言题目 - 调用qsort函数对数组进行排序

    如题 其实没什么难的,只要严格按照 qsort 函数的参数来填充即可,这里要用到 函数指针 。 qsort 函数的原型如下: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); 参数说明: base :指向需要排序的数组的指针,数组中每个元素的大小应为 size 字节。

    2024年02月11日
    浏览(45)
  • 【C语言】——指针六:冒泡排序与qsort函数的实现

    1.1、冒泡排序的原理      在实践过程中,我们难免会碰到要给一组数据排序的情况。如果我们掌握一些排序的算法,效率就会高很多。排序的方法有方法有很多,如:希尔排序,快速排序,堆排序……,今天,我们讲的排序方法就是—— 冒泡排序 !      冒泡排序

    2024年04月16日
    浏览(50)
  • 【C语言】回调函数,qsort排序函数的使用和自己实现,超详解

    先记录一下访问量突破2000啦,谢谢大家支持!!! 这里是上期指针进阶链接,方便大家查看:添加链接描述 大家好呀,今天分享一下上期指针进阶中剩余的内容——回调函数,这个很重要滴,让我们一起来学会学懂他吧!!! 标准概念: 回调函数就是一个通过函数指针调

    2024年02月12日
    浏览(53)
  • 【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

    目录 1、函数指针数组 1.1、函数指针数组是什么?  1.2、函数指针数组的用途:转移表 2、扩展:指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍  3.2、回调函数的案例:qsort函数 3.2.1、回顾冒泡排序  3.2.1、什么是qsort函数? 函数指针数组 是什么?首先主语是 数

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包