广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++qsort函数的实现(冒泡排序)
  • 561
分享到

C/C++qsort函数的实现(冒泡排序)

c语言c++算法 2023-10-20 21:10:52 561人浏览 独家记忆
摘要

 个人主页: 仍有未知等待探索_数据结构,小项目,C语言疑难-CSDN博客 专题分栏: C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、讲解实现 1、给整型数组排序   排序实现 总代码  2、qsort

 个人主页:

仍有未知等待探索_数据结构,小项目,C语言疑难-CSDN博客

专题分栏:

C语言疑难_仍有未知等待探索的博客-CSDN博客

目录

一、引言

二、讲解实现

1、给整型数组排序 

 排序实现

总代码 

2、qsort中参数cmp函数怎么实现

1.浮点型

2.结构体类型 


一、引言

第一个参数是void*base:指向要排序数组的第一个对象的指针,转换为 void*。

第二个参数是size_t num:数组中按基数指向的元素数。size_t是无符号整数类型。

第三个参数是size_t  size:数组中每个元素的大小(以字节为单位)size_t是无符号整数类型。

第四个参数是int (*compar)(const void*p1,const void*p2)):指向比较两个元素的函数的指针。

大家是不是很疑惑,咱们写冒泡排序或者选择排序的时候,感觉也没有那么的复杂,为什么C语言库函数中qsort函数的参数那么的麻烦。为什么还要传size_t size呢?大家是不是会有这样的疑问呢?今天我就给大家详细的讲解一下!(库函数中qsort函数是快速排序,我用冒泡排序实现) 

二、讲解实现

1、给整型数组排序 

 首先,我们需要先把自定义函数的参数给设计好,但是因为我们是实现库函数中的qsort函数,所有我们就直接把库函数中的参数写出来就行了。

我们现在要排序的是整型数组,所以也需要一个整型数组。

sz是为了计算出数组的长度。

问:为什么自定义函数的接收数组的参数类型是void*,而不是int*呢?

答:void* 是一种无类型指针,可以指向任意类型的数据,无需强制类型转换。意思就是说,当你把数组arr传给void*base的时候,不用管为什么base的类型不是int*,可以把void*类型理解为一个万能的类型。(注意:void*类型的变量,不能直接进行解引用访问,也不能进行指针运算,想进行上述操作必须进行强制类型转化)

#includeint cmp(void* x, void* y){return *(int*)x - *(int*)y;}//声明自定义排序函数void qsort_m(void* base, size_t num, size_t size,int (*compar)(const void* p1, const void* p2));int main(){int arr[] = { 9,8,7,6,5,4,3,2,1 };//提供一个整型数组int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的长度qsort_m(arr, sz, sizeof(arr[0]), cmp);//自定义排序函数的调用int i = 0;for (i = 0; i < sz; i++)//输出printf("%d ", arr[i]);return 0;}

 排序实现

void qsort_m(void* base, size_t num, size_t size, int (*compar)(const void* p1, const void* p2)){int i = 0, j = 0;for (int i = 0; i < num - 1; i++){for (int j = 0; j < num - 1 - i; j++){if (compar(((char*)base + j * size), (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}}

compar(((char*)base + j * size), (char*)base + (j + 1) * size),这块要把base强转为char*类型,目的是这个char*能表示更多的数据类型,char*解引用仅能得到一个字节的数据,而int*等其他的类型解引用之后,能得到更多的字节的数据均比char*的大,所以用char*类型可以得到所有传进来的数据,所以,到这里就明白了,为什么要传入数据类型的大小,j*size是为了让数组访问下一个空间的数据。

 最后就剩一个比较简单的交换函数。

void swap(char* buf1, char* buf2, size_t size){int i = 0;for (int i = 0; i < size; i++){int tmp;tmp = *(buf1 + i);*(buf1 + i) = *(buf2 + i);*(buf2 + i) = tmp;}}

总代码 

#includeint cmp(void* x, void* y){return *(int*)x - *(int*)y;}void swap(char* buf1, char* buf2, size_t size);void qsort_m(void* base, size_t num, size_t size, int (*compar)(const void* p1, const void* p2));int main(){int arr[] = { 9,8,7,6,5,4,3,2,1 };//提供一个整型数组int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的长度qsort_m(arr, sz, sizeof(arr[0]), cmp);//自定义排序函数的调用int i = 0;for (i = 0; i < sz; i++)//输出printf("%d ", arr[i]);return 0;}void qsort_m(void* base, size_t num, size_t size, int (*compar)(const void* p1, const void* p2)){int i = 0, j = 0;for (int i = 0; i < num - 1; i++){for (int j = 0; j < num - 1 - i; j++){if (compar(((char*)base + j * size), (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}}void swap(char* buf1, char* buf2, size_t size){int i = 0;for (int i = 0; i < size; i++){int tmp;tmp = *(buf1 + i);*(buf1 + i) = *(buf2 + i);*(buf2 + i) = tmp;}}

2、qsort中参数cmp函数怎么实现

        cmp是一个函数指针,这个函数指针指向的是一个函数,这个函数的返回值是int类型的。当返回值<0 ,p1 指向的元素先于 p2 指向的元素 ;返回值=0 ,p1 指向的元素等效于 p2 指向的元素;返回值 >0 ,p1 指向的元素在 p2 指向的元素之后。

如果想详细的知道的话,请点链接,看我上一篇。 

C语言qsort函数的使用_仍有未知等待探索的博客-CSDN博客

1.浮点型

int cmp(const void* p1, const void* p2){return *(float*)p1 - *(float*)p2;}

2.结构体类型 

typedef struct Stu{char name[20];int score;}Stu;int cmp(const void* p1, const void* p2){return ((Stu*)p1)->score - ((Stu*)p2)->score;}int main(){Stu s[3] = { { "张三",50 }, { "王五",70 }, { "李四",60 } };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp);for (int i = 0; i < sz; i++)printf("%s %d\n", s[i].name,s[i].score);return 0;}

最后、谢谢大家的支持 !

来源地址:https://blog.csdn.net/qq_73435980/article/details/133203433

--结束END--

本文标题: C/C++qsort函数的实现(冒泡排序)

本文链接: https://www.lsjlt.com/news/433312.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++qsort函数的实现(冒泡排序)
     个人主页: 仍有未知等待探索_数据结构,小项目,C语言疑难-CSDN博客 专题分栏: C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、讲解实现 1、给整型数组排序   排序实现 总代码  2、qsort...
    99+
    2023-10-20
    c语言 c++ 算法
  • C++ qsort函数排序与冒泡模拟实现流程详解
    目录一、qsort排序函数1、函数功能特点2、函数参数3、比较函数4、测试qsort排序(1)测试qsort函数排序整形(2)测试qsort函数排序结构体二、冒泡模拟qusort函数...
    99+
    2022-11-13
    C++ qsort函数排序 C++冒泡排序
  • C语言qsort函数用冒泡排序实现过程详解
    目录前言1.冒泡排序的实现1.1冒泡排序的概念1.2具体代码的实现2.qsort函数3.qsort函数的实现前言 这篇文章就是指针进阶的收尾环节了,相信看过C语言进阶—&...
    99+
    2023-02-14
    C语言qsort函数 C语言冒泡排序实现qsort函数
  • C语言中qsort函数用法及用冒泡排序实现
    目录一、qsort函数简介二、qsort函数的使用1.整型数组排序2.字符串排序3.字符串长度排序4.浮点型数组排序5.结构体类型排序三、冒泡排序实现qsort函数的功能1.冒泡排序...
    99+
    2022-11-13
    C语言 qsort函数使用 C语言 qsort 冒泡排序 C语言 qsort
  • C#中怎么利用排序函数实现冒泡排序
    今天就跟大家聊聊有关C#中怎么利用排序函数实现冒泡排序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。所谓冒泡排序就是在每一次排序的过程中总有一个***的值被移动到后面,值小的就像水泡...
    99+
    2023-06-17
  • C#冒泡排序的类库的实现
    本篇内容主要讲解“C#冒泡排序的类库的实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#冒泡排序的类库的实现”吧!直接在c#中建立类库,类中可以实现不同的方法和属性;直接编码,无需右键单击类...
    99+
    2023-06-17
  • C++中如何实现冒泡排序
    这篇文章给大家介绍C++中如何实现冒泡排序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++冒泡排序代码示例:#include < iostream.h> #include&...
    99+
    2023-06-17
  • 【C语言】用冒泡排序实现my_qsort
    大家好,我是苏貝,本篇博客带大家了解如何用冒泡排序实现my_qsort,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 前言二. 冒泡排序三. ...
    99+
    2023-10-07
    c语言 排序算法 开发语言
  • C语言详解冒泡排序实现
    目录前言一、冒泡排序是什么二、具体步骤1.代码解释2.读入数据总结前言 在排序中,有各种各样的排序方式,今天我们将要来介绍《冒泡排序》。今天会从冒泡排序的具体意义和他的操作来展开。 ...
    99+
    2022-11-13
  • c语言冒泡排序怎么实现
    C语言冒泡排序的实现步骤如下:1. 定义一个数组来存储待排序的元素。2. 使用两层循环来比较相邻两个元素的大小,并进行交换。3. 外...
    99+
    2023-08-25
    c语言
  • C#实现冒泡排序和插入排序算法
    1.选择排序(冒泡排序) 升序 用第一个元素跟其他元素比较,如果该元素比其他元素,则交换,保证该元素是最小的。然后再用第二个元素跟后面其他的比较,保证第二个元素是除第一个最小的。依次...
    99+
    2022-11-13
  • C#委托与冒泡排序实例
    C#实现委托 namespace Delegate { delegate void DGSayiHi(string name);//声明委托 delegate voi...
    99+
    2022-11-13
  • C#怎么实现冒泡排序和插入排序算法
    这篇文章主要讲解了“C#怎么实现冒泡排序和插入排序算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现冒泡排序和插入排序算法”吧!1.选择排序(冒泡排序)升序用第一个元素跟其他元素...
    99+
    2023-06-30
  • C语言中的冒泡排序问题
    目录冒泡排序的原理冒泡排序的步骤冒泡排序代码冒泡排序两种不同循环方法原理总结冒泡排序的原理 冒泡排序的步骤 假设我们现在有一个无序数组 arr[] = { 2,9,1,3,7,6 ...
    99+
    2022-12-27
    C语言冒泡排序 C冒泡排序 冒泡排序
  • C语言冒泡排序超全面实现流程
    目录普通版冒泡排序qosrt函数终极版冒泡排序终极版冒泡排序整体测试代码普通版冒泡排序 冒泡排序想必大家都很了解了吧,冒泡排序的算法思想就是两两比大小,一轮一轮比,每比完一轮排出一个...
    99+
    2023-01-13
    C语言冒泡排序原理 C语言冒泡排序算法
  • C#算法中如何实现冒泡排序、插入排序、选择排序
    这篇文章主要介绍了C#算法中如何实现冒泡排序、插入排序、选择排序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。冒泡排序法是数组等线性排列的数字从大到小或从小到大排序。以从小到...
    99+
    2023-06-26
  • C语言冒泡排序的方式介绍
    这篇文章主要介绍“C语言冒泡排序的方式介绍”,在日常操作中,相信很多人在C语言冒泡排序的方式介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言冒泡排序的方式介绍”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-20
  • C语言实现冒泡排序算法的示例详解
    目录1. 问题描述2. 问题分析3. 算法设计动图演示4. 程序设计设计一设计二结论5. 流程框架6. 代码实现7. 问题拓展1. 问题描述 对N个整数(数据由键盘输入)进行升序排列...
    99+
    2022-11-13
  • C语言实现冒泡排序的思路以及过程
    目录C语言实现<冒泡排序>整体思路代码实现C语言实现<冒泡排序> 你们好!我是飞人!此篇文章是我进入IT行业第一篇博客,若有不妥之处,欢迎指点。 此篇讲解冒泡...
    99+
    2022-11-12
  • C语言标准库函数qsort(快速排序函数)
    qsort函数是C语言标准库中提供的一个快速排序函数。它的函数原型如下:```cvoid qsort(void *base, siz...
    99+
    2023-09-23
    C语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作