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

article/2025/9/18 5:05:32

一、前言

在对一组数组进行排序是,我们经常用到冒泡排序,它是一种较简单的排序算法。

冒泡排序的原理如下:

  1. 比较相邻的两个元素。如果第一个比第二个大,就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

请添加图片描述

根据上图可以发现:n个元素的比较,需要n-1趟;每一趟比较的次数n-趟数。

通常我们会针对某一种类型实现一个冒泡排序,示例:

#include <stdio.h>void Bubble_Sort_Int(int* arr, int len)
{for (int i = len - 1; i > 0; i--){for (int j = 0; j < 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[] = {4,5,2,6,9,2,0};int len = sizeof(arr)/sizeof(*arr);Bubble_Sort_Int(arr, );return 0;
}

但是上面的代码存在一个问题,就是只能排序整形数据。如果我们想把一个浮点型、字符串等其他类型也进行排序,显然这套代码是不适用的。那有没有一种能够排序任何数据的算法呢?

二、设计思路

在此之前,我们先看C语言的一个库函数qsort():

void qsort(void* ptr, size_t count, size_t size, int (*comp)(const void*, const void*)); /*
作用:把一组数据以快速排序的方式升序排列。
参数: 1. ptr - 指向待排序的数组的指针。 2. count - 数组的元素数目。 3. size - 数组每个元素的字节大小。 4. comp - 比较函数。若首个参数小于第二个,则返回负整数值,若首个参数大于第二个,则返回正整数值,若两参数等价,则返回零。该函数需要使用者自己实现。
*/

代码示例:

int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
int main()
{int arr[] = { 4,5,2,6 };int len = sizeof(arr) / sizeof(*arr);qsort(arr, len, sizeof(*arr), cmp_int);return 0;
}

那么我们也可以模拟实现一个qsort函数,但是采用冒泡排序的方式实现。

三、代码实现

#include <stdio.h>
#include <string.h>//交换两个元素 - p1和p2是两个元素的起始地址,size是每个元素的大小
void Swap(char* p1, char* p2, size_t size)
{//将每一个字节进行交换for (int i = 0; i < size; i++){char tmp = *(p1 + i);*(p1 + i) = *(p2 + i);*(p2 + i) = tmp;}
}//通用的冒泡排序算法(升序)
void Bubble_Qsort(void* ptr, size_t count, size_t size, int (*comp)(const void*, const void*))
{//交换的趟数for (int i = 0; i < count - 1; i++){//每一趟每个元素的交换for (int j = 0; j < count - 1 - i; j++){/*为什么要把ptr转换成char*类型?因为我们并不知道这是一个什么类型的数据,也就不知道一次能访问多少个字节,如果我们把它转换成char*类型,再解引用,就可以操作一个字节。*/if (comp((char*)ptr + j*size, (char*)ptr + (j+1)*size) > 0){Swap((char*)ptr + j * size, (char*)ptr + (j + 1) * size, size);}}}
}
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;//如果它们的差大于零,说明p1大于p2
}
int cmp_str(const void* p1, const void* p2)
{return strcmp((char*)p1, (char*)p2);
}
int main()
{//定义两个需要排序的数组int arr[] = { 4,5,2,6,9,2,0 };char str[] = "dcbaaaaa";//计算arr数组的元素个数int len = sizeof(arr) / sizeof(*arr);//调用排序函数Bubble_Qsort(str, strlen(str), sizeof(*str), cmp_str);Bubble_Qsort(arr, len, sizeof * arr, cmp_int);//打印排序后的元素printf("%s\n", str);for (int i = 0; i < len; i++){if (arr[i] != 0){printf("%d ", arr[i]);}}return 0;
}

输出结果:
在这里插入图片描述

ps:如有问题或想法欢迎在讨论区讨论。


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

相关文章

第三次项目需求文档

北京理工大学大学疫苗接种系统 文章目录 一.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;总之和…

Synaplify综合Removing

记录一下用Synaplify综合出现的Removing警告问题&#xff0c;在用Synaplify综合的时候&#xff0c;你可能综合完之后发现有的port不见了&#xff0c;或者instance不见了&#xff0c;这都是很常见的问题&#xff0c;这个时候你只要去搜索log关键词Removing&#xff0c;再和你要找…

Vivado与Synplify联合设计FPGA

这篇文章主要记录近几天在使用Vivado以及Synplify工具进行FPGA的Synthesis、Implementation、以及BitStream出现的相关问题。 一、工具使用 RTL代码编辑&#xff1a;修改Vivido内置编辑器为VSCode编辑器&#xff0c;个人习惯&#xff0c;偏好VSCode。修改内置编辑器&#xff…

如何使用Synplify综合vivado带IP核的工程

文章目录 使用Synplify综合的好处synplify的教程方法1&#xff08;无效&#xff09;方法2 VIVODO工程遇到的问题 使用Synplify综合的好处 下面的说法来自网上&#xff1a; 综合时间更好&#xff0c;综合出来所使用的逻辑更少综合的时序更好 在IC设计中&#xff0c;使用Synplif…