模仿qsort实现一个冒泡排序的通用算法

article/2025/9/18 5:09:58
  1. 💥qsort函数介绍
  2. 💥冒泡排序介绍
  3. 💥什么是冒泡排序的通用算法
  4. 💥模仿qsort的一个冒泡排序的通用算法
  5. 💥结语

在这里插入图片描述


  1. 🔥qsort函数介绍

    在一些编程题中经常需要你按照某个指标按照从小到大或从大到小输出一些数据,这时你可以自己写一个排序函数进行排序,但是其实C语言函数库中就有一个排序函数–qsort函数,使用它可以节省你单独写排序函数所耗费的时间,因而在一些比赛中广泛应用。
    qsort函数用白一点的话来讲就是可以排任何类型的数,不仅仅局限于整形
    它要用到的头文件<stdilb.h>
    下面是它的函数参数介绍🚩

void qsort ( void * base, 	//base:参与排序的数组指针size_t num, 	//num:参与排序的元素个数;size_t size, 	//size:单个元素的大小;int ( * comparator ) ( const void *, const void * ) )//( * comparator ) ( const void *, const void * ):比较函数指针;

*base:参与排序的数组指针;
num:参与排序的元素个数;
size:单个元素的大小,单位是字节;
( * comparator ) ( const void , const void * ):比较函数指针(程序员自己定义);


我们来一个实际列子使用一下qsort函数>>

#include<stdio.h>
#include<stdlib.h>
struct Stu
{char name[20];int age;
};int sort_by_age(const void* e1, const void* e2)//用来比较age大小的函数,这里就相当于qsort中的比较函数
{//如果age1>age2就返回大于零,相等就返回零,小于就返回小于零的数即可return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int main()
{//使用qsort函数排序结构体数据struct Stu s[3] = { {"zhangsan", 30},{"lisi", 34},{"wangwu", 20} };int sz = sizeof(s) / sizeof(s[0]);//按照年龄来排序qsort(s, sz, sizeof(s[0]), sort_by_age);for (int i = 0; i < 3; i++){printf(" %s %d  \n",s[i].name, s[i].age);}return 0;
}

运行后的结果>
在这里插入图片描述
当然如果你想用名字排名也可以,只需把这个比较函数传给qsort即可

int sort_by_name(const void*e1, const void*e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

  1. 🔥冒泡排序介绍

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

它的时间复杂度是o(N^2)
假如有一个数组为(21435)
在这里插入图片描述
这个也比较简单我就直接上代码了>>


void BBsort(int arr[], int size)
{int j,i,tem;for (i = 0; i < size-1;i ++)//size-1是因为不用与自己比较,所以比的数就少一个{int count = 0;for (j = 0; j < size-1 - i; j++)	//size-1-i是因为每一趟就会少一个数比较{if (arr[j] > arr[j+1])//这是升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置{tem = arr[j];arr[j] = arr[j+1];arr[j+1] = tem;count = 1;}}if (count == 0)			//如果某一趟没有交换位置,则说明已经排好序,直接退出循环break;	}

这里有一个我上一期的冒泡排序,可以看看C语言—冒泡排序


  1. 🔥什么是冒泡排序的通用算法

    简而言之,通用算法就是适用于一般数据的排序,也就是说我们上面这个冒泡排序只能用来排序整形的数,而我们的通用冒泡排序就是模仿qsort函数一样可以用来排序任意数据。💭
    我们实现的这个冒泡排序通用算法区别于C语言函数库中的qsort在于qsort同的是快速排序思想,而我们用的是冒泡排序思想。

  1. 🔥模仿qsort的一个冒泡排序的通用算法

⭐️首先我们要想qsort为什么能排序任意类型的数据?
✨我们从它的函数参数或许可以知道些许qsort

void qsort ( void * base, 	//base:参与排序的数组指针size_t num, 	//num:参与排序的元素个数;size_t size, 	//size:单个元素的大小;int ( * comparator ) ( const void *, const void * ) )//( * comparator ) ( const void *, const void * ):比较函数指针;

🐾这里就直接代码展示>>
代码往后有解释为什么,或者有什么不懂希望你们可以跟我交流。


//qsore函数使用
//模仿qsort实现一个冒泡排序的通用算法
#include<stdio.h>
#include<stdlib.h>
void Swap(char* buff1, char* buff2, int width);//交换元素的函数声明
//base数组首地址,sz数组元素长度,width元素占多少个字节,cmp元素比较的方式的函数,元素相等return 0,大于return 大于零的数,小于则return小于零的数
void bubble_sort(void *base,int sz,int width,int (*cmp)(const void* e1,const void* e2))
{int i, j;for (i = 0; i < sz; i++){	//一趟的排序for (j = 0; j < sz - i - 1; j++){//两个元素比较if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);}}}
}int cmp(const void* e1,const void* e2)
{return *(int*)e1 - *(int*)e2;
}
int main()
{int arr[] = { 1,3,4,2,6,5,7,8,9,10 };qsort(arr, sizeof(arr) / sizeof(arr[0]), 4, cmp);//bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), 4, cmp);for (int j = 0; j < 10; j++){printf("%d ", arr[j]);}return 0;
}
void Swap(char* buff1, char* buff2, int width)//交换元素的函数
{int i;for (i = 0; i < width; i++){char tem = *buff1;*buff1 = *buff2;*buff2 = tem;buff1++;buff2++;}
}

这些是我从上面拿出来重点要跟大家说明的

		void*base

☁️首先为什么是void* 类型,可能有些小伙伴不知道void* 的用法,我这里简单说一下,void* 确实它跟int* char* 等等都是指针,而像int* 这些是只能接收一下int* 类型的指针,void* 就不一样了,它可以接收所有的指针类型
这就很好的解释了为什么要用void* 来作为函数参数了,因为我们是要排序任意类型的数据,所以一定要用void* 来接收


比较一下通用冒泡排序和一般冒泡排序的判断元素大小

if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
if (arr[j] > arr[j+1])//一般的冒泡排序

☁️而这里就体现了为什么要传每一个元素的大小了,因为是接收任意类型的数据,所以我们需要通过每一元素的大小来确定该用多少字节来进行比较和元素交换,而且这里base要强制类型转换,因为void*
是不能直接访问的,我们把它按char*来处理后,就很容易跟后面传进来的“width”元素大小进行匹配


....
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);......
void Swap(char* buff1, char* buff2, int width)//交换元素的函数
{int i;for (i = 0; i < width; i++){char tem = *buff1;*buff1 = *buff2;*buff2 = tem;buff1++;buff2++;}
}

☁️这是一个交换函数,这里可以是void* 接收,也可以提前将base强制类型转换成char* 然后再传,我这就是后者。这我要跟大家说的就是为什么要传“width”元素大小,因为跟前面一样,我们知道了元素大小才能知道要交换多少个元素




在这里插入图片描述

  1. 🔥结语

本人也是初学者,难免出现一些错误的地方,欢迎各位帮忙大佬指正。


在这里插入图片描述


http://chatgpt.dhexx.cn/article/UgRNYgUi.shtml

相关文章

c语言冒泡排序数组指针,c语言冒泡排序,指针,数组

冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面…

汇编——实现冒泡排序+讲解

题目描述&代码 有一个首地址为A的N字数组&#xff0c;编写程序采用冒泡排序使该数组中的数按照从大到小的次序整序。 数据存储在A的数组中&#xff08;即内存中&#xff09;&#xff0c;我们需要利用冒泡排序实现从大到小排序。 ;description data SEGMENT USE16a dw …

实现一个通用的冒泡排序 - C语言

一、前言 在对一组数组进行排序是&#xff0c;我们经常用到冒泡排序&#xff0c;它是一种较简单的排序算法。 冒泡排序的原理如下&#xff1a; 比较相邻的两个元素。如果第一个比第二个大&#xff0c;就交换它们两个。对每一对相邻元素做同样的工作&#xff0c;从开始第一对到…

第三次项目需求文档

北京理工大学大学疫苗接种系统 文章目录 一.UML图1.用例图2.类图3.活动图4.顺序图 二.需求规格说明文档1.需求和功能说明1.1.获取的功能需求.2.功能划分1.2.1.登录界面1.2.2.预约服务1.2.3.接种查询 2.工作量展示2.1.需求获取2.1.1.项目前景和范围2.1.2.涉众分析2.1.4.面谈 2.…

项目文档编写规范

此文件是 项目文档编写规范 的 readme 编写范例&#xff0c;点击 我要改进 即可查看其 Markdown 内容。 项目概述 产品名称&#xff1a;LaraBBS 项目代号&#xff1a;larabbs 官方地址&#xff1a; https://learnku.com/laravel/t/6592 LaraBBS 是一个简洁的论坛应用…

项目文档管理

项目文档管理&#xff08;Project Documents Management&#xff09; 目录 [隐藏 ] 1 项目文档管理的概述 2 文档管理在项目进程中的重要作用 3 如何建立项目文档管理规定 4 参考文献 <script type"text/javascript"> if (window.showTocToggle) { var …

项目文档如何管理?

在项目进行过程中&#xff0c;会产生很多相关文档文件。通常会散落的分布在不同员工的设备中以及聊天记录中&#xff0c;这种管理方式不仅增大了文件丢失的风险&#xff0c;而且不利于团队文件协作&#xff0c;以及项目经验知识沉淀。 项目文件的管理是项目管理中不可缺少的一…

项目部署文档

1.前提环境 名称版本jdkjdk1.7(建议不要超过1.8)mysql5.7tomcat7(建议不要超过8) 输入 java -version出现如下为jdk安装成功 2.Java环境安装与配置 参见&#xff1a;https://www.linuxidc.com/Linux/2017-01/139212.htm 3.Tomcat安装部署说明 以使用提供的tomcat为例tar z…

如何写项目文档?项目文档有哪些?

软件新人经常问我一个项目应该到底有哪些文档&#xff0c;在此结合工作实际把我一般形成的文档作一列表&#xff0c;仅供诸位参考。 一、项目立项建议书 项目立项建议书主要用于分析项目要求与各种资源是否能够匹配&#xff0c;用来决策层决定是否最终立项。 主要要素包括&…

synplify成功运行起designware的方法,巨坑

因为手头FPGA是zynq ultrascale。所以更新了synplify到2019版本。手里的项目必须要用designware来做验证。各种研究&#xff0c;填了N多的坑。终于搞定。 先说原理&#xff1a; 1. 电脑上有design compile&#xff0c;license各种都搞定&#xff0c;dw库可用。可以装在虚拟机…

VIVADO2018与SYNPLIFY联合使用

VIVADO2018与SYNPLIFY联合使用 1、synplify生成网表文件.edf ①新建工程&#xff0c;设置所选的FPGA型号。 ②添加源文件&#xff0c;可以源文件&#xff0c;也可以是包括很多源文件的文件列表&#xff08;.v/.sv&#xff09;。 ③根据需要添加约束文件.fdc。 ④点击RUN生成网…

ModelSim,synplify,ISE后仿真流程

首先&#xff0c;我把我用到的软件说明一下。如果你发现根据我的操作&#xff0c;你还是解决不了ModelSim后仿真的问题&#xff0c;那就可能是软件版本的问题。 1&#xff0c; ModelSim Se 6.1b 2&#xff0c; Synplify Pro 7.5.1 3&#xff0c; ISE 5.2i &#xff08;这个…

Python 中的Sympy详细介绍

Python 中的Sympy详细使用 遇到复杂计算找python绝对不让你失望&#xff0c;sympy是一个Python的科学计算库&#xff0c;用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。虽然Matlab的类似科学计算能力也很强…

如何使用synplify综合ISE Core Generate生成的IP核

Xilinx的ISE软件有自带的综合工具XST&#xff0c;但是我们有时候需要使用第三方的综合工具&#xff08;例如Synopsys的Synplify Pro,Synplify Primier&#xff0c;其中&#xff0c;Synplify Primier可以综合synopsys的DesignWare库&#xff09;&#xff0c;这时候就需要在synpl…

synplify 9.6.2 download

现在这种工具太难找了&#xff0c;找了一上午才搞定&#xff1b;唉&#xff0c;还是贡献出来吧&#xff0c;最好别被河蟹掉 链接&#xff1a;http://pan.baidu.com/s/1pJv7ovx 密码&#xff1a;um2k 里面的破解方法有点问题&#xff0c; 一、install exe&#xff0c;选Fl…

如何破解Synplify Pro 9.6.2? (SOC) (Synplify)

软件安装与注意事项如下&#xff1a; Introduction Step 1&#xff1a; 安裝Synplify Pro Step 2&#xff1a; 選擇Floating (License is on a license server) Step 3&#xff1a; 稍後會設定SYNPLCTYD_LICENSE_FILE&#xff08;我认为是LM_LICENSE_FILE&#xff09;系統變數&…

lattice 的Synplify pro综合工具,以及RTL寄存器查看

对于diamond来说&#xff0c;查看RTL级的示图时&#xff0c;必须以LSE&#xff08;自带的综合工具&#xff09;来编译综合代码。 而经常会出现Synplify pro编译通过&#xff0c;LSE编译出现bug的情况&#xff0c;所以用LSE编译代码&#xff0c;总不让人放心。 默认使用Synpli…

Synaplify综合的常用命令(1)

在芯片设计中大都绕不开用Synaplify来对数字代码进行综合&#xff0c;特别是在大系统中&#xff0c;资源很多&#xff0c;这样会导致FPGA中的资源不够用&#xff0c;就需要我们在综合中加一些限定来解决一些问题&#xff0c;这篇文章先介绍一些自己遇到的和资源相关的问题以及相…

ISE工程导入Vivado

在介绍工程模式下的设计方式时&#xff0c;提到了Vivado一个选项Imported Project能够导入本由synplify、xst或者ISE设计套件所创建的RTL工程数据。参见&#xff1a;https://blog.csdn.net/qq_26652069/article/details/91562652 下面尝试将ISE中的一个实现UART回显的工程导入…

Synaplify综合报错Signal 011 error in m_xilinx

在用Synaplify2020的版本综合的时候会报出错误&#xff0c;E:Internal Error in m_xilinx Stack trace或者是Signal 011 error in m_xilinx Stack trace。乍一看像是环境问题&#xff0c;其实是你的代码里面用到的ram的问题&#xff0c;当然也可能是rom的问题&#xff0c;总之和…