冒泡排序(C语言)

article/2025/9/18 5:07:44

文章目录

  • 1. 冒泡排序如何实现
    • 1.1 冒泡排序函数的错误设计
    • 1.2 数组名是什么?
    • 1.3 冒泡排序函数的正确设计

1. 冒泡排序如何实现

  1. 往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。

  2. 冒泡排序思想:两两相邻元素进行比较,有可能的话需要交换。
    比如一组整形数组arr[10]={9,8,7,6,5,4,3,2,1,0},如何利用冒泡排序的方法进行排序呢?
    在这里插入图片描述
    那我们将会这样使用该函数:

1.1 冒泡排序函数的错误设计

那我们如何利用代码进行冒泡排序呢?看代码:

#include<stdio.h>
void sort(int* arr)
{//确定个数int ret = sizeof(arr) / sizeof(arr[0]);//趟数int i = 0;for (i = 0; i < ret - 1; i++){//每一趟处理数据int j = 0;for (j = 0; j < ret - 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] = { 1,3,5,7,9,2,4,6,8,10 };sort(arr);//循环打印for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

但当我们执行代码却发现:
在这里插入图片描述
为什么我们通过sort函数进行数组排序,但结果却还是原数组呢?
在这里插入图片描述
我们发现在sort函数内部,计算的数组个数ret=1,数组元素ret不应该是10吗?怎么就变成1了呢?(在调用函数内部查看数组所有元素:(数组名,个数)–>(arr,10)),为了解决这个问题,我们不得不了解“数组名是什么?

1.2 数组名是什么?

在这里插入图片描述这里我们打印出数组名的地址和数组首元素的地址,我们可以发现:数组名是数组首元素的地址
1.在这里插入图片描述
看到这里估计就有人疑惑了,不是说arr是数组首元素的地址吗?那首元素的地址无非就是4\8了,但这为什么是40呢?40不是整个数组地址的大小吗?
2.在这里插入图片描述
我们发现数组+1和数组的第一个元素+1结果相同,但(&)取地址arr+1却不同。(解释一下为什么是40个字节:这里地址是用十六进制表示的第一位+8,第二位+2,8x160=8,2x161=32,32+8=40)。
这是因为数组+1是跳过一个数组,数组首元素+1跳过的是一个元素。

总结

数组名是数组首元素的地址,但存在两个特例:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,&数组名取出的是数组的地址。

1.3 冒泡排序函数的正确设计

在此之前,我们先解决之前错误代码的问题:

#include<stdio.h>
void sort(int* arr)
{//确定个数int ret = sizeof(arr) / sizeof(arr[0]);//趟数int i = 0;for (i = 0; i < ret - 1; i++){//每一趟处理数据int j = 0;for (j = 0; j < ret - 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] = { 1,3,5,7,9,2,4,6,8,10 };sort(arr);//循环打印for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

当数组传参的时候,实际上只是把数组“arr”的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。
那么,既然传过去的是首元素的地址(4)函数内部的 sizeof(arr) 结果是4,4/4得出的ret=1.
如果 方法1 错了,该怎么设计?

#include<stdio.h>
void sort(int* arr, int ret)
{//趟数int i = 0;for (i = 0; i < ret - 1; i++){//每一趟处理数据int j = 0;for (j = 0; j < ret - 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] = { 1,3,5,7,9,2,4,6,8,10 };//确定个数int ret = sizeof(arr) / sizeof(arr[0]);sort(arr,ret);//循环打印for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

我们在main函数里先求出数组的个数,然后再通过sort函数把数组个数传过去就可以了,这样正确的冒泡排序就写完了。


http://chatgpt.dhexx.cn/article/3gr8Eq0u.shtml

相关文章

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

&#x1f4a5;qsort函数介绍&#x1f4a5;冒泡排序介绍&#x1f4a5;什么是冒泡排序的通用算法&#x1f4a5;模仿qsort的一个冒泡排序的通用算法&#x1f4a5;结语 &#x1f525;qsort函数介绍 在一些编程题中经常需要你按照某个指标按照从小到大或从大到小输出一些数据&#x…

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回显的工程导入…