深圳好的高端企业网站建设公司/广告主资源哪里找

深圳好的高端企业网站建设公司,广告主资源哪里找,中国移动采购与招标网,新华社官网冒泡排序的缺陷及优化 定义: 冒泡排序(Bubble Sort)是一种简单且常用的排序算法。其基本思想是通过多次遍历待排序的序列,依次比较相邻的两个元素,并根据需要交换它们的位置,使得较大的元素逐渐向后移动&a…

冒泡排序的缺陷及优化

定义: 

冒泡排序(Bubble Sort)是一种简单且常用的排序算法。其基本思想是通过多次遍历待排序的序列,依次比较相邻的两个元素,并根据需要交换它们的位置,使得较大的元素逐渐向后移动,较小的元素逐渐向前移动。这个过程类似于水中的气泡逐渐上升,因此得名“冒泡排序”。

操作步骤

  1. 比较第 1 个和第 2 个元素,按大小排序。

  2. 移动到下 1 个对(第 2 和第 3),继续比较和排序。

  3. 重复这个过程,每轮结束后将最大(小)的数“沉”到数组末尾。

实现 

基本实现:冒泡排序

分析

排序过程如下图所示:

17a4a34de62dfd59cc6cddf2b62dedd2.jpeg
  • 设定数组长度为n。

  • 外层循环用于控制总的遍历次数,最多需要 n-1 次。

  • 内存循环用于比较并排序相邻元素。

  • 每经过一轮遍历,总会把当前遍历最后一个数放在最末未,所以内循环次数随着外循环次数增加而减少。具体关系为:当前内循环次数 = n - 1 - 当前外循环次数 。

代码

使用冒泡排序方法,从大到小排序数据。编写代码如下

/*** @ 基本实现:冒泡排序* @ arr - 待排序的数组     num - 数组元素个数* @ 要求从大到小排序数据* */ 
void bubble_sort(int *arr, int num)
{int i, j, tmp;for (i=0; i<num-1; i++) {for (j=0; j<num-i-1; j++) {if (arr[j] < arr[j+1]) {tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}

}

运行结果
1094395ff0db399c06687e20cfc5bd02.png

优化 1. 短路法

分析
0221352b94a27bfd8f2e178f6b032414.png
  • 由上图可以看出,在第 1 轮遍历完成,就已经得到我们需要的排序顺序,此时第 2 、3、4 轮遍历数据完全无交换过程(浪费时间)。

  • 当某一轮遍历数据完全无交换即可表示此时我们的排序已完成,可以完全跳过后序遍历。从而提高排序效率。

  • 此功能在数据本身是有序的情况下将会大大减少排序过程。

代码

在冒泡的基础上,加入短路判断,若当前排序已完成,提前退出排序。编写代码如下

/*** @ 优化 1:冒泡排序,短路优化,如果某一轮没有发生交换,说明数组已经排序完成,提前退出。* @ arr - 待排序的数组     num - 数组元素个数* @ 要求从大到小排序数据* */ 
void bubble_sort_short_circuit(int *arr, int num)
{int i, j, tmp;char change_flag = 0;   /* 交换标志,1表示当前有交换 */for (i=0; i<num-1; i++) {change_flag = 0;for (j=0; j<num-i-1; j++) {if (arr[j] < arr[j+1]) {    /* 数据不符合从大到小规则,交换 */tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;change_flag = 1;}}/* 若是某一轮没有发生交换,说明数组已经排序完成,提前退出 */if (!change_flag) {printf("quit i[%d] j[%d]\n", i, j);break;}}
}
运行结果
a5249e223bb5f5b697a1efb4b35a22e9.png

优化 2.鸡尾酒排序

分析
a5ce3bc5f910d44f05e5ff0a8a076bd5.jpeg
  • 为进一步提高效率,采用双向扫描的方式。

  • 设定左右指针 left 和 right。

  • 在每 1 轮中进行 2 次扫描——从左到右将较大的元素移到右边,再从右到左将较小的元素移到左边。

  • 如果某次循环没有发生任何交换,说明数组已排序完成。

代码

使用鸡尾酒排序方式。编写代码如下

/*** @ 优化 2:鸡尾酒排序,每一轮遍历先从左到右,再从右到左,可以更快减少未排序数据。* @ arr - 待排序的数组     num - 数组元素个数* @ 要求从大到小排序数据* */ 
void cocktail_shaker_sort(int *arr, int num)
{int i, tmp;char change_flag = 1;           /* 交换标志,1表示当前有交换 */int left = 0, right = num-1;    /* 用于控制左右遍历 */while ((left <= right) && change_flag) {change_flag = 0;/* 从左至右,将最小的数移动到最后面 */for (i=left; i<right; i++) {if (arr[i] < arr[i+1]) { tmp = arr[i];arr[i] = arr[i+1];arr[i+1] = tmp;change_flag = 1;}}left++;/* 从右至左,将最大的数移动到最前面 */for (i=right-1; i>=left; i--) {if (arr[i] > arr[i-1]) { tmp = arr[i];arr[i] = arr[i-1];arr[i-1] = tmp;change_flag = 1;}}right--;}
}
运行结果
8ee2e16b13e29e18a4b9e672c4e87242.png

完整代码 

/*** @Filename : bubble_sort.c* @Revision : $Revision: 1.00 $* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)* @Description : 冒泡排序的缺陷及优化
**/#include <stdio.h>
#include <string.h>#define MAX_NUM     5  /*** @ 打印数组* @ arr - 待打印的数组     num - 数组元素个数* */
void print_arr(int *arr, int num) 
{int i;for (i=0; i<num; i++)printf("%02d ", arr[i]);printf("\n");
}/*** @ 基本实现:冒泡排序* @ arr - 待排序的数组     num - 数组元素个数* @ 要求从大到小排序数据* */
void bubble_sort(int *arr, int num)
{int i, j, tmp;printf("排序前数组内容: ");print_arr(arr, num);for (i=0; i<num-1; i++) {for (j=0; j<num-i-1; j++) {if (arr[j] < arr[j+1]) {tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}printf("第%d轮第%d次排序: ", i+1, j+1);print_arr(arr, num);}}printf("排序后数组内容: ");print_arr(arr, num);
}/*** @ 优化 1:冒泡排序,短路优化,如果某一轮没有发生交换,说明数组已经排序完成,提前退出。* @ arr - 待排序的数组     num - 数组元素个数* @ 要求从大到小排序数据* */
void bubble_sort_short_circuit(int *arr, int num)
{int i, j, tmp;char change_flag = 0;   /* 交换标志,1表示当前有交换 */printf("排序前数组内容: ");print_arr(arr, num);for (i=0; i<num-1; i++) {change_flag = 0;for (j=0; j<num-i-1; j++) {if (arr[j] < arr[j+1]) {    /* 数据不符合从大到小规则,交换 */tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;change_flag = 1;}printf("第%d轮第%d次排序: ", i+1, j+1);print_arr(arr, num);}/* 若是某一轮没有发生交换,说明数组已经排序完成,提前退出 */if (!change_flag) {//printf("quit i[%d] j[%d]\n", i, j);break;}}printf("排序后数组内容: ");print_arr(arr, num);
}/*** @ 优化 2:鸡尾酒排序,每一轮遍历先从左到右,再从右到左,可以更快减少未排序数据。* @ arr - 待排序的数组     num - 数组元素个数* @ 要求从大到小排序数据* */
void cocktail_shaker_sort(int *arr, int num)
{int i, tmp;char change_flag = 0;           /* 交换标志,1表示当前有交换 */int left = 0, right = num-1;    /* 用于控制左右遍历 */int cnt = 0, cntleft, cntright; /* 记录排序次数 */printf("排序前数组内容: ");print_arr(arr, num);while (left <= right) {       /* 从左至右,将最小的数移动到最后面 */change_flag = 0;cntleft = 0;cntright = 0;for (i=left; i<right; i++) {if (arr[i] < arr[i+1]) { tmp = arr[i];arr[i] = arr[i+1];arr[i+1] = tmp;change_flag = 1;}cntleft++;printf("第%d轮第%d次排序(从左至右): ", cnt+1, cntleft);print_arr(arr, num);}if (!change_flag)break;left++;/* 从右至左,将最大的数移动到最前面 */change_flag = 0;for (i=right-1; i>=left; i--) {if (arr[i] > arr[i-1]) { tmp = arr[i];arr[i] = arr[i-1];arr[i-1] = tmp;change_flag = 1;}cntright++;printf("第%d轮第%d次排序(从右至左): ", cnt+1, cntright);print_arr(arr, num);}if (!change_flag)break;right--;cnt++;}printf("排序后数组内容: ");print_arr(arr, num);
}int main(void)
{int buf0[] = {3, 8, 5, 1, 2};int buf1[] = {3, 8, 5, 1, 2};int buf2[] = {3, 8, 5, 1, 2};printf ("----------冒泡排序---------\n");bubble_sort(buf0, MAX_NUM);printf ("----------短路优化---------\n");bubble_sort_short_circuit(buf1, MAX_NUM);printf ("---------鸡尾酒排序---------\n");cocktail_shaker_sort(buf2, MAX_NUM);return0;
}

运行结果 

4435adf8f8003b4ddc8d1a343925c617.png

总结 

复杂度

  • 时间复杂度:最坏情况下为O(n²),平均情况下也为O(n²),效率较低。

  • 空间复杂度:O(1),属于原地排序算法。

优点

  • 实现简单,易于理解和实现。

  • 空间复杂度低,属于原地排序算法。

缺点

  • 时间复杂度较高,不适合大规模数据的处理。

  • 对于最坏情况(数组完全逆序),效率低下。

优化

  • 短路优化:若某一轮遍历中完全没发生交换,可以提前结束。这在最好情况下非常有效。

  • 鸡尾酒排序:双向遍历,可以更快将元素放到正确位置,减少比较次数。

总结

冒泡排序虽然在实际应用中并不常用,但由于其简单性和教学价值,常被用作学习排序算法的基础。对于小规模数据或需要简单排序的情况,它仍是一个不错的选择。通过了解冒泡排序的基本原理和优化版本,我们可以更好地理解更复杂的排序算法的设计思想。

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

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

相关文章

FPGA实现UltraScale GTH光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头动态彩条输入视频之-->ADV…

Flutter使用gen_l10n实现多语言支持

实现步骤 在你的 Flutter 项目的 pubspec.yaml 文件中&#xff0c;确保添加了 flutter_localizations 和 intl 依赖。 flutter_localizations:sdk: flutterintl: ^0.18.0在 pubspec.yaml 中&#xff0c;添加 flutter 部分的 generate 配置。 generate: true在项目工程根目录新…

Spring IoC的实现机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Spring IoC的实现机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring IoC的实现机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring IoC&#xff08;Inversion of Control…

2025最新深度学习pytorch完整配置:conda/jupyter/vscode

从今天开始&#xff0c;开始一个新的专栏&#xff0c;更新深度学习相关的内容&#xff0c;从入门到精通&#xff0c;首先的首先是关于环境的配置指南&#xff1a;工欲善其事必先利其器&#xff01; PyTorch 是由 Facebook&#xff08;现 Meta&#xff09;开发的 开源深度学习框…

达梦tpcc压测

造数 在这个日志输出中&#xff0c;主要执行了一系列数据库操作&#xff0c;涵盖了数据库信息检查、表的创建与数据加载、索引的添加、数据验证等步骤。具体分析如下&#xff1a; 数据库信息检查&#xff1a; 查询了数据库的版本、实例名称、日志文件大小、字符集等信息。 删…

通达信如何导出以往的分时数据

1当天分时数据的导出 以梦网科技为例&#xff0c;在分笔交易上面右键&#xff0c;选择“放大”&#xff0c;放大后选择“选项”&#xff0c;选择“数据导出”&#xff0c;弹出界面中修改路径与文件名即可。 2以往数据的导出 以梦网科技为例&#xff0c;今天是2025年2月14号…

1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

进入题目页面如下 直接开审 <?php // 定义一个名为 xctf 的类 class xctf {// 声明一个公共属性 $flag&#xff0c;初始值为字符串 111public $flag 111;// 定义一个魔术方法 __wakeup()// 当对象被反序列化时&#xff0c;__wakeup() 方法会自动调用public function __wa…

Excel 合并列数据

场景 要求每行数据的每个字段的内容不能以 [2,3,33,22] 形式展示 要求独立成列形式如下 代码 maven 依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>…

【vue3】实现pdf在线预览的几种方式

今天一天对当前可用的pdf预览插件做了测试&#xff0c;主要需求是只能预览不能下载&#xff0c;但对于前端来说&#xff0c;没有绝对的禁止&#xff0c;这里只罗列实现方式。 目前采用vue3版本为&#xff1a;3.2.37 iframevue-officepdfjs-dist iframe 先说最简单的&#xf…

腿足机器人之一- 机械与电子组件概览

腿足机器人之一机械与电子组件概览 引言机械组件骨架材料关节设计关节机械组件轴承&#xff08;ings&#xff09;连杆&#xff08;Linkages&#xff09;齿轮&#xff08;Gears&#xff09; 电气组件电机控制器传感器 四足机器人设计双足机器人设计波士顿Atlas机器人 引言 腿足…

重读《Java面试题,10万字208道Java经典面试题总结(附答案)》

最近重读了这篇文章&#xff0c;对很多概念模糊的地方加了拓展和补充。 目录 1、JDK 和 JRE 有什么区别&#xff1f; 2、 和 equals 的区别是什么&#xff1f; 3、final 在 java 中有什么作用&#xff1f; 4、java 中的 Math.round(-1.5) 等于多少&#xff1f; 5、String…

浏览器打开Axure RP模型

1&#xff0c;直接使用chrome打开&#xff0c;提示下载插件 2&#xff0c;需要做一些操作 打开原型文件&#xff0c;找到resources\chrome\axure-chrome-extension.crx文件&#xff0c;这就是我们需要的Chrome插件。 将axure-chrome-extension.crx文件后缀名改为axure-chrome…

优雅的git log输出内容更加醒目

执行命令 git config --global alias.lg "log --graph --prettyformat:%C(red)%h%C(reset) - %C(yellow)%d%C(reset) %C(magenta)<%an>%C(reset) %C(cyan)(%ad)%C(reset) %C(green)%s%C(reset) (%cr) --abbrev-commit --dateformat:%Y-%m-%d %H:%M:%S"

平面与平面相交算法杂谈

1.前言 空间平面方程&#xff1a; 空间两平面如果不平行&#xff0c;那么一定相交于一条空间直线&#xff0c; 空间平面求交有多种方法&#xff0c;本文进行相关讨论。 2.讨论 可以联立方程组求解&#xff0c;共有3个变量&#xff0c;2个方程&#xff0c;而所求直线有1个变量…

链表 —— 常用技巧与操作总结详解

引言 链表作为一种动态数据结构&#xff0c;以其灵活的内存管理和高效的插入删除操作&#xff0c;在算法与工程实践中占据重要地位。然而&#xff0c;链表的指针操作复杂&#xff0c;容易引发内存泄漏和野指针问题。本文博主将从基础操作到高阶技巧&#xff0c;系统化解析链表的…

【LLM】13:大模型算法面试题库

一、Transformer篇 1. Transformer的结构是什么 Transformer 由 编码器&#xff08;Encoder&#xff09; 和 解码器&#xff08;Decoder&#xff09; 两部分组成&#xff0c;两部分都包含目标嵌入层、位置编码、多头注意力层、前馈网络&#xff0c;且有残差连接和层归一化&am…

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…

Linux-文件基本操作

1.基本概念 文件: 一组相关数据的集合 文件名: 01.sh //文件名 2.linux下的文件类型 b block 块设备文件 eg: 硬盘 c character 字符设备文件 eg: 鼠标&#xff0c;键盘 d directory 目录文件 eg: 文件夹 - regular 常规文件…

【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用

一、场景描述 我想写一个轮播图的程序&#xff0c;只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适&#xff0c;然后我就想自己写自动轮播&#xff0c;因此&#xff0c;这篇文章里面只是自动轮播的部分&#xff0c;没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…

LabVIEW与USB设备开发

开发一台USB设备并使用LabVIEW进行上位机开发&#xff0c;涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输&#xff0c;帮助用户顺利完成项目开发。下面是一个详细的说明&…