关于冒泡算法的那些事儿

Erlang和排序算法那些蛋疼的事儿 Java的十大排序相信大家都见过了吧,今天来看看erlang的排序算法怎么写,不一定写的出十个哈,写的不好轻喷,本篇博客利用erlang实现了冒泡排序、选择排序、插入排序、快速排序、归并排序。 阅读详情

排序算法的复杂度
在这里插入图片描述

关于冒泡算法你了解多少:
首先我们规定数据如下
5 8 6 3 9 1 1 7

在对数组进行冒泡排序的前提下,首先求出数组是否为空
方法一:
如果数组是用vector定义的,即:
vector nums;
//或
vector& nums;
,则这样写:
if nums.size() == 0:
return false
方法二:
如果数组是这样定义的,即:
int nums[] = {1,2,3};
先算下数组长度:
nums_length = sizeof(nums)/sizeof(nums[0])
然后判断数组为空:
if nums_length == 0:
return false
原文链接:https://blog.youkuaiyun.com/qq_40977108/article/details/99290544

解决了上述问题以后,最原始的冒泡排序如下

#include <iostream>
#include <string>
using namespace std;
void BubbleSort(int a[], int n)
{
	int i, j, temp;//用来控制内外循环   temp作为临时变量交换
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	for (i = 0; i < n; i++)
		cout << a[i] << " ";
}
int main()
{
	int a[8] = { 5,8,6,3,9,1,1,7 };
	int b[4] = { 0,2,3,4 };
	int count = 0, i = 0;
	count = sizeof(a) / sizeof(a[0]);//c++中没有直接提供求数组长度的函数,需要用这个方法获取数组长度
		BubbleSort(a,count);
	return 0;
}

上述的冒泡算法进一步思考,会有缺陷,例如在第五轮排序的时候他就已经是排好序的了,那么接下来的几轮会白白的进行比较,浪费时间
那么对上述代码进行改进一下,立一个flag。判断中途是否已经有序,如果已经有序的话就提前退出,那么改进的代码如下

#include <iostream>
#include <string>
using namespace std;
void BubbleSort(int a[], int n)
{
	int i, j, temp;//用来控制内外循环   temp作为临时变量交换
	for (i = 0; i < n; i++)
	{
		int flag=1;
		for (j = 0; j < n - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag=0;
			}
		}
		if(flag)
			break;
	}
	for (i = 0; i < n; i++)
		cout << a[i] << " ";
}
int main()
{
	int a[8] = { 5,8,6,3,9,1,1,7 };
	int b[4] = { 0,2,3,4 };
	int count = 0, i = 0;
	count = sizeof(a) / sizeof(a[0]);//c++中没有直接提供求数组长度的函数,需要用这个方法获取数组长度
		BubbleSort(a,count);
	return 0;
}

那么再以一个新的数列来判断上述冒泡算法 的优越性
3 4 2 1 5 6 7 8
这个数列前半部分无序,后半部分有序,右半部分已然是有序的,可是每轮还要白白的比较那么多次,上述算法需要进一步改进
此时可以在每一轮的排序后,记录最后一次元素交换的位置,该位置就是无序数列的边界,再往后就是有序区的位置,因此改进后 的代码如下

#include <iostream>
#include <string>
using namespace std;
void BubbleSort(int a[], int n)
{
	int i, j, temp;//用来控制内外循环   temp作为临时变量交换
	int last_exchange=0;
	int Bubble_Sort_border=n-1;//无序数组比较的边界
	for (i = 0; i < n; i++)
	{
		int flag=1;
		for (j = 0; j<Bubble_Sort_border; j++)
		{
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag=0;
                last_exchange=j;
			}
		}
		Bubble_Sort_border=last_exchange;
		if(flag)
			break;
	}
	for (i = 0; i < n; i++)
		cout << a[i] << " ";
}
int main()
{
	int a[8] = { 3,4,2,1,5,6,7,8 };
	int b[4] = { 0,2,3,4 };
	int count = 0, i = 0;
	count = sizeof(a) / sizeof(a[0]);//c++中没有直接提供求数组长度的函数,需要用这个方法获取数组长度
		BubbleSort(a,count);
	return 0;
}

到这冒泡算法就结束了吗,不可能,你在看看这一串
2 3 4 5 6 7 8 1
上述代码能否很好的解决问题,明明只调一个数字就可以完成排序,可是还要白白的比较七轮,那遇到这种问题改怎么解决呢
基于冒泡算法,延伸出一种算法叫做

鸡尾酒排序

鸡尾酒的排序过程是双向的具体怎么实现了
首先正向还是向冒泡算法一样的排序,
第一轮,1和8交换,
第二轮 反向比较,让1逐渐的向前,第二轮比较完成以后,实际上就有序了,然后进行第三轮的比较,第三轮比较完成以后已经有序,由于设置了flag所以我们此次比较只需三轮,是不是高效了很多呢,那么具体的代码实现如下

#include <iostream>
#include <string>
using namespace std;
void BubbleSort(int a[], int n)
{
	int i, j, temp;//用来控制内外循环   temp作为临时变量交换
	for (i = 0; i < n/2; i++)//奇数轮
	{
		int flag=1;
		for (j = i; j<n-i-1; j++)//这时候要注意此时  j的初值是i因为每次不管是奇数还是偶数轮,排序的最先位置一定是有序的
		{
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag=0;                
			}
		}
		if(flag)
			break;
  // 偶数轮开始之前  flag 重新置为1
		 flag=1;
		for (j = n-i-1; j>i; j--)//这时候要注意此时  j的初值是i因为每次不管是奇数还是偶数轮,排序的最先位置一定是有序的
		{
			if (a[j] < a[j -1])
			{
				temp = a[j];
				a[j] = a[j - 1];
				a[j +-1] = temp;
				flag=0;               
			}
		}
		if(flag)
			break;
	}
	for (i = 0; i < n; i++)
		cout << a[i] << " ";
}
int main()
{
	int a[8] = { 3,4,2,1,5,6,7,8 };
	int b[4] = { 0,2,3,4 };
	int count = 0, i = 0;
	count = sizeof(a) / sizeof(a[0]);//c++中没有直接提供求数组长度的函数,需要用这个方法获取数组长度
		BubbleSort(a,count);
	return 0;
}

以上就是关于冒泡算法的全部优化方法。你get到没,下一次分享快速排序

Unity通用Buff系统,Buff编辑器(1,理论篇)(技能系统之Buff篇) 逻辑层根据游戏的规则和设计,控制Buff的生命周期、影响目标对象的属性或行为,以及处理Buff的交互和冲突。Buff堆叠和冲突:有些游戏中允许同类型的Buff叠加,以增加效果的强度,而有些游戏中可能不允许Buff叠加,只能由更强力的Buff来覆盖较弱的Buff。灵活个性化:每个游戏对象拥有自己的BuffManager,可以实现个体对象的独特Buff效果,增加游戏的多样性和个性化。自由控制:每个对象独立管理自己的Buff,可以自由地激活、更新和移除Buff效果,提供更精细的控制和逻辑实现。 阅读详情

相关推荐

mac安全干净卸载Anaconda3

主要原因是python命令没有映射到已经安装的python版本上,则需要添加。修改~/.bash_profile文件,将anaconda相关删除。现在想卸载Anaconda,恢复使用mac系统自带的Python。最后在mac的应用目录删除Anaconda。查看所有版本的python所在安装目录。或者不使用软连接映射,也可使用。再次查看python映射。查看python版本。建立软连接,添加映射。

buyue 5961

冒泡排序--数组的简单排序,从大到小,从小到大

冒泡排序 是计算机程序中较为常见和简单的排序算法,它需要重复地走访需要进行排序的元素列,按照一定顺序依次比较两个相邻的元素,如果顺序错误就把他们交换过来。 示意原图如下: 我们需要的结果示意图如下: 那我们应该怎么进行程序的编写才能满足这样的结论呢? 你首先会想到用什么方法来进行排序呢? 此刻。你想想,在军训时候,同排队列中是怎么行按照身高高低来进行战队的?是不是每个人和自己相邻的下一位进行比...

weixin_45756796的博客 1万+

(二)MS-MPI多机通信

1.关于MPI多机通信 一台计算机处理数据的能力是有限的,MPI的主要作用就是用来实现并行计算机,即将多台主机联机,实现大规模、高性能的计算机机群。我们知道一台计算机同时运行多个进程时,由于计算机资源是共享的,多个进程都会占用一些资源,每个进程运行的效率就会降低,比如当一台计算机同时跑着多个大型应用时会变得非常卡顿。所谓多机通信,可以理解为将本应该在同一台主机上运行的多个进程分配到多台主机上,以往...

xinwuya_的博客 4392

【数据结构与算法】- 冒泡排序那点儿事儿

冒泡排序是基础的排序算法,也是我们不得不知的一个算法,一文带你深入剖析冒泡排序思想,以及编码,思想入手,一步步开启编码之路,如何进阶如何优化,一起来看

Arielle-L 271

A股历史数据免费下载终极指南:4000+个股数据一键打包获取

本文提供了获取A股历史数据的完整免费方案,重点介绍了Tushare Pro、AkShare等开源金融数据API的使用方法。通过详细的Python脚本示例,指导读者如何自动化批量抓取、清洗、存储4000多只个股的历史行情数据,并分享数据质量校验与性能优化技巧,助力量化研究与市场分析。

ooo22的博客 2218

Windows上python的spark环境搭建

1.安装好JDK 下载并安装好jdk-12.0.1_windows-x64_bin.exe,配置环境变量: 新建系统变量JAVA_HOME,值为Java安装路径 新建系统变量CLASSPATH,值为 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注意最前面的圆点) 配置系统变量PATH,添加 %JAVA_HOME%bin;%JAVA_HOME%jrebin 在CMD中输入:java或者java -version,不显示不是内部命令等,说明安装成功。

weixin_43915303的博客 651

【算法那些事儿】冒泡排序、插入排序、选择排序以及对数选择器

冒泡排序、插入排序、选择排序以及对数选择器 1. 冒泡排序 //冒泡排序 public static void bubbleSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int end = arr.length - 1;...

Smilence的博客 185

LeRobot 机器人学习(Robot Learning)教程(二)经典机器人学

本文探讨了机器人学中基于学习的方法与传统动力学方法的对比与发展趋势。文章指出,传统方法依赖精确的动力学模型和大量人工调参,面临跨任务泛化能力弱、工程复杂度高、物理建模局限性等问题。随着机器学习技术的进步和机器人数据集的丰富,基于学习的方法展现出三大优势:(1)能够实现跨任务与实体的泛化;(2)降低对人类专业知识的依赖;(3)利用历史数据优化性能。文中以平面机械臂为例,分析了传统逆运动学方法的计算复杂性和环境适应性挑战,并指出基于学习的方案在处理高维感知输入、复杂接触动力学等方面具有明显优势。文章认为,结合物

2506_90492529的博客 1066

算法那些事儿

优化算法是专为解决特定问题而设计的一系列计算机指令,它们广泛应用于计算科学的各个领域。这些算法的核心目标是高效、准确地解决问题。算法的设计紧密关联于所需解决问题的复杂程度。在处理简单问题时,采用直观的蛮力方法往往就能奏效。然而,面对复杂问题时,就需要设计更为精细、高效的算法。这些复杂算法通常融合了多种策略和技术,以确保在合理的时间和资源消耗下,能够得出问题的准确解或近似解。

x1ao_fe1的博客 992

图解联合概率密度、边缘概率密度、条件概率密度之间的关系

简要图解联合概率密度、边缘概率密度、条件概率密度之间的关系

一个搬运知识的笨小孩 2万+

Python爬虫教程:抓取Android或iOS应用中的数据

随着智能手机的普及,移动应用程序已经成为我们生活中不可或缺的一部分。从社交媒体、在线购物到金融服务和健康管理,几乎所有领域都有相应的手机应用程序(App)服务用户。而这些应用程序通常会存储大量的数据,例如用户行为、产品信息、订单记录等。如果我们能有效地抓取这些数据,可以为数据分析、商业智能、用户行为分析等提供有力支持。本文将重点介绍如何使用Python爬虫技术抓取Android或iOS应用中的数据,尤其是如何从这些应用的后端接口、存储、或网页中提取数据。我们将探讨如何通过反向工程技术访问移动应用中的API接

2201_76125261的博客 801

Java语言——冒泡排序

在计算机科学的世界里,排序算法是数据处理的基础之一,而冒泡排序作为最简单直观的排序算法之一,是每个程序员学习之旅的必经之路。本文将带您深入探索冒泡排序的基本原理、Java实现代码以及如何对其进行优化,以提高效率。冒泡排序,英文名Bubble Sort,其基本思想是通过重复遍历待排序的数列,比较相邻元素的值,如果顺序错误(即前一个元素大于后一个元素),就交换它们的位置。这样,每一轮遍历后,最大的元素就像水中的气泡一样“浮”到了数列的末尾。因此得名“冒泡排序”。

日积跬步,终至千里 1624

MATLAB地理数据处理 25:植被物候提取及分析模型优化(Savitzky-Golay)

之前我写过一篇使用Savitzky-Golay处理遥感数据,获取地面物候信息的MATLAB代码,但是发现存在一些问题:对物候开始期和物候结束期的阈值设定都为相同值,但是有些研究中,需要根据不同的环境条件,设置不同的物候阈值,所以对其进行相应的修改。

amyniez的博客,欢迎交流讨论 2233

每周一算法之一——冒泡排序算法

今儿刚把Notepad++与Visual C++ Compiler的环境配好(其实也就是几个命令的事儿),随便写了个算法,编译通过啦! 打算以后每周至少练习一个算法。 冒泡排序就是一个相当普通的排序算法,写这儿的象征意义大于实际意义。 冒泡排序的时间复杂度是O(n2),空间复杂度是O(n),是一种稳定的排序算法。 需要注意的是:每一轮冒泡后,最后一个数必然是这一轮排序完的最大值,下一...

weixin_30482383的博客 114

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

排序算法的那些事儿

〇、 对于排序算法的考察是很基础的算法考察,而很多面试都会有手写代码的考察,因此这次总结中代码的实现用了伪代码。 可以了解到: 常见的排序算法 算法的实现 (最后来写这个引言,真是毫无生气啊…… 一、 排序算法 时间复杂度 空间复杂度 是否稳定 冒泡排序 О(n2n^2n2) О(111) 是 选择排序 О(n2n^2n2) О(111) 否 插入排序 О(n2n^2n...

旮旯实验室GalaGame 257

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

排序算法就是那么回事儿<二>

上一次我们讲解了快速排序归并排序。其实这两个算法有一个共同点,就是都运用到了分治的思想。而且我们还了解到这两个算法的时间复杂度分别为O(nlogn)和O(nlogn)(最差为O(n^2))其实,快速排序法的精髓就在于交换,他其实是另一种算法的该进。这个算法就是冒泡排序。冒泡排序法 冒泡排序算法的运作如下:(从后往前) 1 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2 对

了不起的董二狗 388

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java那点事儿--排序算法

动画版排序算法 一、冒泡排序(bubble_sort) O(n2) JAVA代码实现 算法:对待排序数组,从第一个开始,到最后一个,依次进行两两比较,假设是从小到大排序,则根据大小进行位置互换,一轮后最大者就会再数组的最末尾;之后对剩余的数组进行上述步骤,直至剩余数组为空; /** * 时...

chuangyiyu1995的博客 170

前台美眉能看懂的冒泡排序

冒泡排序代码实现(java)如下/** * @Version: 1.0 * @Description: 冒泡排序 */ import com.jiajia.Arr...

IT局 210

“程序员的‘东北大菜’:算法那点事儿”

在这篇文章中,我们深入浅出地聊了一下算法。从算法的重要性,到常见算法的生活应用,再到快速排序的详细解读。如果你想了解算法,又不想被那些专业术语搞得头大,那这篇文章绝对适合你

weixin_45363243的博客 147

题目练习之数组的那些事儿

合并两个有序数组学习了这么久C语言知识,也了解了算法的一些概念,我们可以通过一些题目检验自己是否真正的掌握,我们一起来看看下面的练习~

2401_82924480的博客 1116

简单排序的那些事儿(c++详细讲解)

选择排序从数组的第一个元素开始,假设它已经是最小值。:在剩余未排序的元素中(从第二个元素开始),找到最小元素的索引。:将找到的最小元素与数组的第一个元素交换位置。此时,数组的前两个元素已经是最小的两个元素。:将数组的起始位置向后移动一位(即从第二个元素开始),重复步骤2和步骤3,直到整个数组排序完成。:选择排序每次遍历都能找到最小(或最大)的元素,但是它不会直接放在正确的位置上,而是通过交换的方式逐步移动到正确的位置。

qq_51065805的博客 833

数据结构和算法,也就那么回事儿

金三银四来了,各大厂动静不小,都在储备人才,绝对是程序员面试的黄金时间了,不少同学也在后台反馈面试中遇到的一些问题,所以今天想跟大家说说算法。说起算法,那大厂面试是绝对必考的,可以说是一...

嵌入式Linux 879

冒泡排序(图解+代码详解)

冒泡排序

弘羽 3092

排序那些事儿

基本排序算法比较与选择 前几天应一个朋友的要求,帮他完成了数据排序的一个作业。觉得很有给大家参考的价值,所以经过他同意,作了些修改帖了上来。源代码见附件,代码中实现了8种排序算法,各算法名称见下表或见源码。运行程序时,将需要你输入一数值,以确定对多少随机数进行排序。然后将会显示各排序算法的耗时。并且你可选择时否进行正序和反序测试。 由于水平有限,可能存在一些错误,还请各位多多指点! 通过实验

Green_Days 365

八大排序的那些事儿

1.排序-冒泡算法 讲算法太空洞,直接上实例: 上实例中,当后面的都已经排序好的时候其实是不需要交换的,所以就会终止循环。 利用递归的方式写冒泡排序: 2.选择排序 选择排序和冒泡排序有一点点像,选择排序是默认前面都是已经排序好的,然后从后面 选择最小的放在前面排序好的的后面,首先第一轮循环的时候默认的排序好的为空,然 后从后面选择最小的放到数组的第一个位置,第二轮循环的时候默认第一个元素是已经 排序好的,然后从剩下的找出最小的放到数组的第二个位置,第三轮循环的时候默认前 两个都是已...

qq_46309680的博客 422
上一篇: 蓝桥杯 村庄户户通电问题
下一篇: java中用异或方法实现对数据加密解密
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值