当前位置: 首页 > news >正文

冒泡排序——简单理解和使用

阅前声明:如果想直接了解冒泡排序的简化思想,请跳至文章尾部

在介绍之前,我们先看一个用到该功能的实战训练(本人也是从中开始认识到冒泡排序这个函数定义)

对于小白来说,我的思路如下:

1.题目中涉及到三个数组,首先scanf两个整型变量m,n,其次定义三个变长数组arr[m + n] 、arr1[m] 、arr2[n];

2.我们了解到一个关键信息,两个输入的数组为升序类型,那么考虑两个数组中同下标值的元素进行比较,然后根据他们比较的结果在arr中进行元素输入;

具体操作编码如下:(为错误示范,可以理解和纠正一下编码思路)

void input_arr(int arr[], int a,int b)
{for (a = 0; a < b; a++){scanf("%d", &arr[a]);}
}
int smaller(int a, int b)
{if (a >= b)return b;elsereturn a;
}
int bigger(int a, int b)
{if (a >= b)return a;elsereturn b;
}
void print(int a , int arr[])
{int i;for (i = 0; i < a; i++){printf("%d ", arr[i]);}
}
int main()
{int m, n;scanf("%d %d", &m, &n);int arr1[m];//先将三个数组定义出来int arr2[n];int arr[m + n];int i,j;input_arr(arr1, i, m);//输入两个数组input_arr(arr2, i, n);int b = smaller(m,n);//先比较m,n;用新赋值的变量去参与后续判断int c = bigger(m,n);for (j = 0; j < c; j++)//利用变量j对arr数组的元素进行输入{if (j < b)//在相同下标区间内,进行大小判断,要将两个同数量的数组比较并放入新的数组中,需要2b个空间,下标位数为2b-1{arr[2 * j ] = smaller(arr1[j], arr2[j]);//先进行一个同下标数的大小判断,小的放在本位上,大的放在+1位上arr[2 * j + 1] = bigger(arr1[j], arr2[j]);if (j >= 1){arr[2 * j] = bigger(smaller(arr1[j], arr2[j]), arr[2 * j - 1]);//将新的小值与前一次的大值进行比较,纠正排序arr[2 * j - 1] = smaller(smaller(arr1[j], arr2[j]), arr[2 * j - 1]);}}//到这里完成了0-2b-1的数值输入,共2b个数else if (j == b){if (b == m) //判断元素数量大的一方数组后,对超出的第一位数组值进行比较{arr[2 * b] = bigger(arr2[b], arr[2 * b - 1]);arr[2 * b - 1] = smaller(arr2[b], arr[2 * b - 1]);}else{arr[2 * b] = bigger(arr1[b], arr[2 * b - 1]);arr[2 * b - 1] = smaller(arr1[b], arr[2 * b - 1]);}}else{if (b == m){arr[2 * b + j - b] = arr2[j];}else{arr[2 * b + j - b] = arr1[j];}}}for (int s = m + n - 1; s > 0; s--){int temp;if (arr[s] < arr[s - 1]){temp = arr[s];arr[s] = arr[s - 1];arr[s - 1] = temp;}}print(m + n, arr);return 0;
}//仅适合升序,且没有相同数的两个数组

在这个输入例子中,编写的代码出现了明显的错误,存在交替的大小变化,这是由于下标值相差太多的元素之间存在漏比较的情况,这是由于我们比较方式的局限性导致的,不要简单的把一个元素集合按照规定的容量分为多个比较区间,进行依次比较后纠正的元素排列就是我们想要的结果,下面是这种错误观念的示意图

一个数字,确定其在整型数组中正确的大小排序和下标值,应该将其和每一个元素进行比较。

那么我们可以得出冒泡排序的关键思想:

假设一个整型数组 中有N个元素,每一个元素确定自己的正确位置需要与剩余的N-1个元素进行比较,而每一个元素都需要完成这个过程 即 实现数组的正确排序,我们需要完成N * (N - 1)次的比较,细分下来就是C语言中的两个for循环的嵌套使用,具体如下:

	for (int a = 0; a < m + n; a++){for (int b = 0; b < m + n - 1; b++){int temp = 0;if (arr[b] > arr[b + 1]){temp = arr[b + 1];//此时的temp仅为存储数据的一个整型变量,无其他特殊含义arr[b + 1] = arr[b];arr[b] = temp;}}}

因此,我们可以简化并且加深对冒泡排序这个代码块的理解。

有表述不当的地方辛苦不吝赐教,三克油。

打怪升级中..................................................................................................................................

http://www.dtcms.com/a/337591.html

相关文章:

  • NVIDIA 技术沙龙探秘:聚焦 Physical AI 专场前沿技术
  • Handler以及AsyncTask知识点详解
  • 数据结构部分算法记录
  • Oracle维护指南
  • 计算机大数据毕业设计推荐:基于Hadoop+Spark的食物口味差异分析可视化系统【源码+文档+调试】
  • RPM数据库损坏修复:DB_RUNRECOVERY: Fatal error, run database recovery
  • 新能源知识库(78)微网控制器与储能LCU对比
  • 【opencv-Python学习日记(7):图像平滑处理】
  • 普通用户使用docker命令
  • 「数据获取」《中国经济普查年鉴》(2004、2008、2013、2018、2023)(获取方式看绑定的资源)
  • Centos7 使用lamp架构部署wordpress
  • Django开发Web应用
  • Vitis 2023下调用math.h(log)函数提示未定义的解决办法
  • HT6875_2.8W 防削顶单声道D 类音频功率放大器
  • CoRL 2025|隐空间扩散世界模型LaDi-WM大幅提升机器人操作策略的成功率和跨场景泛化能力
  • vue3 el-table-column 列头添加 图标按钮
  • 无人机迫降模式技术要点解析
  • HTTP协议-4-浏览器是怎么抉择HTTP版本的?
  • MySQL Operator开发实战系列:特别篇 - 生产环境故障排查与性能调优指南
  • 第4.3节:awk正则表达式详解-特殊字符
  • PyTorch数据处理工具箱(数据处理工具箱概述)
  • AI大模型实战:用自然语言处理技术高效处理日常琐事
  • 鸿蒙中应用框架和应用模型
  • 【JavaEE】多线程 -- 阻塞队列
  • 使用WinDbg对软件崩溃信息进行抓包的方法
  • 决策树学习笔记
  • Linux内存管理系统性总结
  • RabbitMQ:数据隔离
  • 代码随想录刷题Day36
  • 大数据时代时序数据库选型指南:深度解析与 Apache IoTDB 实践