指针篇章-(冒泡排序详解)

冒泡排序

图解 

tmp图解 

内容图解 

每次循环的次数减少

 for循环详解

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,
一次比较两个元素,如果它们的顺序错误就把它们交换过来。
遍历数列的工作是重复地进行直到没有再需要交换,
也就是说该数列已经排序完成。
在冒泡排序中,外层循环负责控制遍历的轮数,
而内层循环负责在每一轮中进行相邻元素的比较和交换。
通常,冒泡排序的代码如下所示:for (i = 0; i < sz-1; i++) {for (j = 0; j < sz - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换arr[j]和arr[j+1]}}
}
这里的`sz`是数组`arr`的长度。
现在我们来解释为什么内层循环的`j`需要满足`j < sz - i - 1`。在每一轮的外层循环中,最大的元素会被放到数组的最后位置。
因此,在下一轮循环开始时,我们不需要再检查已经排好序的部分。
这意味着,对于外层循环的每一次迭代`i`,我们只需要在内层循环中检查前`sz - i - 1`个元素。
例如,如果数组的长度是`5`,那么:

 当`i = 0`时,我们需要比较所有`5`个元素,因此`j`的范围是`0`到`4`。
当`i = 1`时,最大的一个元素已经在数组的最后一个位置,所以我们只需要比较前`4`个元素,`j`的范围是`0`到`3`。
- 当`i = 2`时,两个最大的元素已经在数组的最后两个位置,我们只需要比较前`3`个元素,`j`的范围是`0`到`2`。
- 以此类推。
如果内层循环使用`j < sz - 1`,那么在`i = 1`时,`j`的范围将是`0`到`4`,这是不必要的,因为我们知道`arr[4]`已经是排序好的了。同样,如果内层循环使用`j < sz`,那么在`i > 0`时,它将检查已经排好序的元素,这也是不必要的。
因此,`j < sz - i - 1`确保了每次外层循环只比较和交换还未排好序的元素,这使得冒泡排序更加高效。

for循环画图详解

下面我用一个简单的图来解释冒泡排序中内层循环的`j`为什么需要满足`j < sz - i - 1`。
假设我们有一个数组`arr` = `[4, 2, 9, 1, 5]`,它的长度是`sz = 5`。我们将通过冒泡排序对这个数组进行排序。
在第一轮外层循环中,`i = 0`,我们需要比较所有元素,所以内层循环的`j`范围是`0`到`4`。在这个过程中,最大的元素`9`会被放到数组的最后一个位置。
在第二轮外层循环中,`i = 1`,最大的元素`9`已经在数组的最后一个位置,所以我们只需要比较前`4`个元素。内层循环的`j`范围现在是`0`到`3`。
在第三轮外层循环中,`i = 2`,两个最大的元素`9`和`5`已经在数组的最后两个位置,我们只需要比较前`3`个元素。内层循环的`j`范围是`0`到`2`。
在第四轮外层循环中,`i = 3`,三个最大的元素`9`、`5`和`4`已经在数组的最后三个位置,我们只需要比较前`2`个元素。内层循环的`j`范围是`0`到`1`。
在第五轮外层循环中,`i = 4`,四个最大的元素`9`、`5`、`4`和`2`已经在数组的最后四个位置,我们只需要比较前`1`个元素。内层循环的`j`范围是`0`到`0`。在这一轮中,内层循环不会执行任何交换,因为`arr[0]`已经是在正确的位置上。
如果没有`sz - i - 1`这个条件,内层循环会在`i > 0`时继续检查已经排好序的元素,这是不必要的。正确的条件`j < sz - i - 1`确保了每次外层循环只比较和交换还未排好序的元素。
下面是一个简化的图示,展示了这个过程:
```


初始数组: [4, 2, 9, 1, 5]
第一轮后: [2, 4, 9, 1, 5] (9移到末尾)
第二轮后: [2, 4, 1, 5, 9] (9和5移到末尾)
第三轮后: [2, 1, 4, 5, 9] (9、5和4移到末尾)
第四轮后: [1, 2, 4, 5, 9] (9、5、4和2移到末尾)
第五轮后: [1, 2, 4, 5, 9] (数组已经排序完成)

代码

//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
从小到大排序 版本1
//void effervescence(int arr[], int sz)
//{
//	for (int i = 0; i < sz - 1; i++)
//	{
//		for (int j = 0; j < sz - 1; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = 0;
//				tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//		}
//	}
//}
//void Print(int arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	int arr[] = { 2,3,4,1,6,5,8,7,9,0,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//排序
//	effervescence(arr, sz);
//	//打印
//	Print(arr, sz);
//	return 0;
//}//版本2
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//从小到大排序 指向同一个空间
void effervescence(int* arr, int sz)
{for (int i = 0; i < sz - 1; i++){for (int j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = 0;tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[] = { 2,3,4,1,6,5,8,7,9,0,10 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;//排序effervescence(arr, sz);//打印for (int i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526332.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研复习C语言初阶(4)+标记和BFS展开的扫雷游戏

目录 1. 一维数组的创建和初始化。 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3. 数组越界 4. 冒泡…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

图像处理与图像分析—图像的读入(C语言)

学习将会依据教材图像处理与图像分析基础&#xff08;C/C&#xff09;版内容展开 什么是数字图像处理 一副图像可以定义为一个二维函数 f(x&#xff0c;y) &#xff0c;其中 x 和 y 是空间&#xff08;平面&#xff09;坐标&#xff0c;任意一对空间坐标 (x,y) 处的幅度值 &am…

springcloud第3季 项目工程搭建与需求说明1

一 需求说明 1.1 实现结构图 订单接口调用支付接口 二 工程搭建 2.1 搭建工程步骤

Linux文件和文件夹操作

前言&#xff1a; 相较于前面背诵的诸多内容&#xff0c;可能现在的部分就需要多多的练习了&#xff0c;难度也慢慢提升。 那就大家一起慢慢努力吧&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录 一、Linux目录结构 &#xff08;一&#xff09;Window…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要&#xff0c;接触了下React Native相关的知识&#xff0c;以一个Android开发者的视角&#xff0c;对React Native 项目组织和构建流程有了一些粗浅的认识&#xff0c;同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

C语言编译成库文件的要求

keil编译成库文件 在Keil中&#xff0c;将C语言源文件编译成库文件通常需要进行以下步骤&#xff1a; 创建一个新的Keil项目&#xff0c;并将所需的C语言源文件添加到该项目中。 在项目设置中配置编译选项&#xff0c;确保生成的目标文件符合库文件的标准格式。 编译项目&…

JavaWeb基础入门——(二)MySQL数据库基础(3-数据表中的关联关系)

六、数据表中的关联关系 6.1 关联关系介绍 MySQL是一个关系型数据库&#xff0c;不仅可以存储数据&#xff0c;还可以维护数据与数据之间的关系——通过在数据表中添加字段建立外键约束 数据与数据之间的关联关系分为四种&#xff1a; 一对一关联 一对多关联 多对一关联 多…

【杂记】IDEA和Eclipse如何查看GC日志

1.Eclipse查看GC日志 1.1 右击代码编辑区 -> Run As -> Run Configurations 1.2 点击Arguments栏 -> VM arguments:区域填写XX参数 -> Run 1.3 控制台输出GC详细日志 2.IDEA查看GC日志 2.1 鼠标右击代码编辑器空白区域&#xff0c;选择Edit 项目名.main()... 2.…

‘ jupyter ‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

安装anaconda后&#xff0c;在 Dos黑窗口 运行 jupyter notebook 的两个问题 原因&#xff1a;没配置环境变量 解决方法&#xff1a; 在 系统环境变量Path 中 添加两个地址 这里以anaconda安装在 D:\anaconda\install 下为例 &#xff08;根据个人安装具体位置而定&#xff…

深入浅出计算机网络 day.1 概论① 信息时代的计算机网络

我想&#xff0c; 我不会暗下来的&#xff0c; 生命是周而复始的橙黄橘绿时 —— 24.3.9 内容概述 计算机网络的各类应用 计算机网络带来的负面问题 我国互联网发展情况 一、计算机网络的各类应用 1.信息浏览和发布 2.通信和交流 3.休闲和娱乐 4.资源共享…

Github 2024-03-10php开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…