IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言冒泡排序进阶(模拟qsort函数) -> 正文阅读

[数据结构与算法]C语言冒泡排序进阶(模拟qsort函数)

本文主要讲述了是如何理解冒泡排序算法以及将冒泡排序进一步优化,达到可以接近模拟qsort函数的目的。


主要分为三大板块:
1:如何理解冒泡排序
2:qsort函数是如何使用
3:试着模拟qsort函数



1 如何理解冒泡排序
冒泡排序,简单地来说就是相邻的两个数字比大小,然后从左到右或者从右到左一直比下去,重复很多趟,直到将一组数字呈现从左到右依次递减,或者从左到右依次递增。

下面看冒泡排序算法:




?

调试结果:
?

思路是调用了两个for循环嵌套进行排序,比较简单。


2 qsort函数是如何使用?

先看源代码:


简化一下便是:
第一个元素base代表的是需要排序的一组数据的首地址
第二个元素?sz代表的是需要排序的数据的个数
第三个元素代表的是需要排序的一组数据的里面的单个元素类型所占的字节数
第四个元素是一个函数指针,需要使用者自己创建一个函数传入,当e1的值大于e2时返回>0的数,当e1<e2时返回<0的数,当e1=e2时返回0

使用的时候要包含头文件<stdlib.h>
使用时的关键是自己需要去创建一个函数用来判断不同类型的一组数据中相邻的两个元素大小,比如说传入一组结构体数组,需要去排序,则需要自己建立一个函数去判断结构体数组中相邻两个元素大小。
举个例子:

?

?我建立了一组结构体数组,然后我要根据结构体数组中的判断成员name的大小来进行排序,则我需要自己创建一个关于比较name中字符串大小的函数,返回值分别是>0和<=0。
则建立函数

然后调用qsort函数,传入函数:

?

这样就根据结构体成员中的name的大小来进行排序了
结果是:

?

?
3:试着模拟qsort函数
?

这里想要利用前面的冒泡排序的思想去模拟一下qsort函数,虽然达不到快排的目的,但是能达到对任何类型传进来的数据进行排序。

?



想要对任何传入任何类型的数据进行排序,首先先看前看qsort函数的三个元素:

第一个元素base指针,由于base是无类型的指针,所以可以接收任何类型的指针,然后再进行强制类型转换来进一步操作

第二个元素是需要排序的个数,只需要计算出个数就行

第三个元素是该传入类型的一组数据的单个元素所占字节数?,即用sizeof操作符来进行计算便可
(第四个元素创建函数在下文)
然后就是将bubble_sort(冒泡排序)进行优化:

这里在冒泡排序的第二重for循环里面的if条件判断语句这里进行修改,将上面第四个元素接收的cmp函数进行调用,并且强制类型转换base为char*然后进行+width(也就是得到每个该未知类型的元素的地址,(比如说传入整形数组,那么(char*)base+width就等于一个元素的地址加4,下一个元素便是(char*)base+8,也就是得到下一个整形元素然后进行比较大小。)
然后建立一个Swap进行每一次判断if的条件大于0后对每两个元素进行一个字节一个字节的内容进行互换:

这里传入的width就是每一个元素的所占字节数,(也就是说传入类型是int就对4个字节里面进行一个字节一个字节的内容进行互换,若是结构体类型所占12个字节则对每相邻的两个元素所占的12个字节的内容进行一个字节一个字节的互换)

接下来就是模拟qsort函数时里面的第四个元素各类型cmp函数的创建。

整形数组类型:

?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 字符串的字符类型


结构体里面的浮点数类型

?


结构体里面的整形类型

?

?结构体里面的字符串类型?

?

这就是借助了冒泡排序算法思想进一步模拟了qsort函数对任意类型的一组数据进行排序,虽然达不到快排的目的,但是能达到对任意类型数据进行排序。

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:17:09  更:2022-02-04 11:17:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:40:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码