java顺序表冒泡排序_冒泡排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...

冒泡排序就这么简单

在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的)。现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了。

排序对我们来说是一点也不陌生了,当你打王者荣耀的时候也会有段位之分,当你打Dota的时候也有天梯分。从高往下数,这个排名是有规律的,就是一种排序。

我最开始接触的就是冒泡排序,所以这篇博文主要讲的是冒泡排序。

冒泡排序的实现

来源百度百科:

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

算法描述:

i从0开始,i与i+1比较,如果i>i+1,那么就互换

i不断增加,直到i

从最简单开始,首先我们创建一个数组,该数组有5位数字:

int[] arrays = {2, 5, 1, 3, 4};

一、第一趟排序

下面我们根据算法的描述来进行代码验算 (第一趟排序):

//使用临时变量,让两个数互换

int temp;

//第一位和第二位比

if (arrays[0] > arrays[1]) {

//交换

temp = arrays[0];

arrays[0] = arrays[1];

arrays[1] = temp;

}

//第二位和第三位比

if (arrays[1] > arrays[2]) {

temp = arrays[1];

arrays[1] = arrays[2];

arrays[2] = temp;

}

//第三位和第四位比

if (arrays[2] > arrays[3]) {

temp = arrays[2];

arrays[2] = arrays[3];

arrays[3] = temp;

}

//第四位和第五位比

if (arrays[3] > arrays[4]) {

temp = arrays[3];

arrays[3] = arrays[4];

arrays[4] = temp;

}

如果前一位的数比后一位的数要大,那么就交换,直到将数组的所有元素都比较了一遍!

经过我们第一趟比较,我们可以发现:最大的值就在数组的末尾了!

format,png

一、第二趟排序

第二趟排序跟第一趟排序一样,也是用前一位与后一位比较,如果前一位比后一位要大,那就交换。值得注意的是:并不需要与最后一位比较了,因为在第一趟排序完了,最后一位已经是最大的数了。同理,我们第二趟排序完了之后,倒数第二位也是第二大的数了。

第二趟排序的代码如下:

//第一位和第二位比

if (arrays[0] > arrays[1]) {

//交换

temp = arrays[0];

arrays[0] = arrays[1];

arrays[1] = temp;

}

//第二位和第三位比

if (arrays[1] > arrays[2]) {

temp = arrays[1];

arrays[1] = arrays[2];

arrays[2] = temp;

}

//第三位和第四位比

if (arrays[2] > arrays[3]) {

temp = arrays[2];

arrays[2] = arrays[3];

arrays[3] = temp;

}

//第四位不需要和第五位比了,因为在第一趟排序结束后,第五位是最大的了。

结果:我们的第二大数已经排在了倒数第二位了

format,png

三、代码简化

值得说明的是:上面的结果看起来已经是排序好的了,其实是我在测试时数据还不足够乱,如果数据足够乱的话,是需要4(n-1)趟排序的!

但我们从上面的代码就可以发现:第一趟和第二趟的比较、交换代码都是重复的,并且我们的比较都是写死的(0,1,2,3,4),并不通用!

我们的数组有5位数字

第一趟需要比较4次

第二趟需要比较3次

我们可以根据上面规律推断出:

第三趟需要比较2次

第四躺需要比较1次

再从上面的规律可以总结出:5位数的数组需要4躺排序的,每躺排序之后次数减1(因为前一趟已经把前一趟数的最大值确定下来了)!

于是我们可以根据for循环和变量将上面的代码进行简化:

int temp;

//外层循环是排序的趟数

for (int i = 0; i < arrays.length - 1 ; i++) {

//内层循环是当前趟数需要比较的次数

for (int j = 0; j < arrays.length - i - 1; j++) {

//前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换

if (arrays[j] > arrays[j + 1]) {

temp = arrays[j];

arrays[j] = arrays[j + 1];

arrays[j + 1] = temp;

}

}

}

四、冒泡排序优化

从上面的例子我们可以看出来,如果数据足够乱的情况下是需要经过4躺比较才能将数组完整排好序。但是我们在第二躺比较后就已经得到排好序的数组了。

但是,我们的程序在第二趟排序后仍会执行第三趟、第四趟排序。这是没有必要的,因此我们可以对其进行优化一下:

如果在某躺排序中没有发生交换位置,那么我们可以认为该数组已经排好序了。

这也不难理解,因为我们每趟排序的目的就是将当前趟最大的数置换到对应的位置上,没有发生置换说明就已经排好序了。

代码如下:

//装载临时变量

int temp;

//记录是否发生了置换, 0 表示没有发生置换、 1 表示发生了置换

int isChange;

//外层循环是排序的趟数

for (int i = 0; i < arrays.length - 1; i++) {

//每比较一趟就重新初始化为0

isChange = 0;

//内层循环是当前趟数需要比较的次数

for (int j = 0; j < arrays.length - i - 1; j++) {

//前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换

if (arrays[j] > arrays[j + 1]) {

temp = arrays[j];

arrays[j] = arrays[j + 1];

arrays[j + 1] = temp;

//如果进到这里面了,说明发生置换了

isChange = 1;

}

}

//如果比较完一趟没有发生置换,那么说明已经排好序了,不需要再执行下去了

if (isChange == 0) {

break;

}

}

format,png

五、扩展阅读

C语言实现第一种方式:

void bubble ( int arr[], int n)

{

int i;

int temp;

for (i = 0; i < n - 1; i++) {

if (arr[i] > arr[i + 1]) {

temp = arr[i];

arr[i] = arr[i + 1];

arr[i + 1] = temp;

}

}

}

void bubbleSort ( int arr[], int n)

{

int i;

for (i = n; i >= 1; i--) {

bubble(arr, i);

}

}

C语言实现第二种方式递归:

void bubble ( int arr[], int L, int R)

{

if (L == R) ;

else {

int i;

for (i = L; i <= R - 1; i++)//i只能到达R-1

if (arr[i] > arr[i + 1]) {

int temp = arr[i];

arr[i] = arr[i + 1];

arr[i + 1] = temp;

}

bubble(arr, L, R - 1);//第一轮已排好R

}

}

测试代码:

int main ()

{

int arr[] = {2, 3, 4, 511, 66, 777, 444, 555, 9999};

bubbleSort(arr, 8);

for (int i = 0; i < 9; i++)

cout << arr[i] << endl;

return 0;

}

5.1时间复杂度的理解:

format,png

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

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

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

相关文章

python 多线程和协程结合_如何让 python 处理速度翻倍?内含代码

阿里妹导读&#xff1a;作为在日常开发生产中非常实用的语言&#xff0c;有必要掌握一些python用法&#xff0c;比如爬虫、网络请求等场景&#xff0c;很是实用。但python是单线程的&#xff0c;如何提高python的处理速度&#xff0c;是一个很重要的问题&#xff0c;这个问题的…

python批量生成图_利用Python批量生成任意尺寸的图片

实现效果 通过源图片&#xff0c;在当前工作目录的/img目录下生成1000张&#xff0c;分别从1*1到1000*1000像素的图片。 效果如下&#xff1a;目录结构 实现示例 # -*- coding: utf-8 -*- import threading from PIL import Image image_size range(1, 1001) def start(): for…

Mysql 如果有多个可选条件怎么加索引_MySQL|mysql-索引

1、索引是什么 1.1索引简介 索引是表的目录&#xff0c;是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录&#xff0c;查找字典内容时可以根据目录查找到数据的存放位置&#xff0c;以及快速定位查询数据。对于索引&#xff0c;会保存在额外的文件…

java 全双工服务器_利用Java实现串口全双工通讯_JAVA实例教程_IT部落

本文介绍了一个简单的通过串口实现全双工通讯的Java类库&#xff0c;该类库大大的简化了对串口进行操作的过程一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯&#xff0c;譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息&#xff0c;并将执…

python语言三大基本控制结构_Python基础(4) 控制结构

三种控制流语句&#xff1a;if、for、while&#xff0c;Python用缩进表明成块的代码&#xff0c;以四个空格表示隶属关系&#xff0c;所以语句不能随意缩进。 1 条件语句 &#xff08;1&#xff09;简单的if语句 a 10 if a > 0: #末尾带“&#xff1a;” print(这是一个整数…

Spring-bean的循环依赖以及解决方式___Spring源码初探--Bean的初始化-循环依赖的解决

本文主要是分析Spring bean的循环依赖&#xff0c;以及Spring的解决方式。 通过这种解决方式&#xff0c;我们可以应用在我们实际开发项目中。 什么是循环依赖&#xff1f;怎么检测循环依赖Spring怎么解决循环依赖Spring对于循环依赖无法解决的场景Spring解决循环依赖的方式我们…

java+cache使用方法_java相关:springboot使用GuavaCache做简单缓存处理的方法

java相关&#xff1a;springboot使用GuavaCache做简单缓存处理的方法发布于 2020-3-29|复制链接摘记: 问题背景实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号)。项目中有一个需求是要实时统计一些数据&#xff0c;一个应用下可能有多个相同的账号。由于服务商接口的…

python程序设计方法_Python程序设计现代方法

章Python概述001 1.1计算机与计算机语言002 1.1.1计算机的诞生与发展002 1.1.2计算机语言概述006 1.1.3翻译执行008 1.2Python语言概述009 1.2.1Python语言发展史009 1.2.2Python语言的特点011 1.2.3Python的应用领域012 1.2.4Python版本的区别012 1.3Python环境配置014 1.3.1安…

Spring中bean的作用域与生命周期

在Spring中&#xff0c;那些组成应用程序的主体及由Spring IoC容器所管理的对象&#xff0c;被称之为bean。简单地讲&#xff0c;bean就是由IoC容器初始化、装配及管理的对象&#xff0c;除此之外&#xff0c;bean就与应用程序中的其他对象没有什么区别了。而bean的定义以及bea…

pat乙级 1014 java_pat乙级1014 福尔摩斯的约会

大侦探福尔摩斯接到一张奇怪的字条&#xff1a;“我们约会吧&#xff01; 3485djDkxh4hhGE 2984akDfkkkkggEdsbs&hgsfdk d&Hyscvnm”。大侦探很快就明白了&#xff0c;字条上奇怪的乱码实际上就是约会的时间“星期四14:04”&#xff0c;因为前面两字符串中第1对相同的大…

python科学编程入门书_Python数据科学零基础一本通

领取成功 您已领取成功&#xff01; 您可以进入Android/iOS/Kindle平台的多看阅读客户端&#xff0c;刷新个人中心的已购列表&#xff0c;即可下载图书&#xff0c;享受精品阅读时光啦&#xff01; - | 回复不要太快哦~ 回复内容不能为空哦 回复已提交审核... 快登录帐号来一起…

python 整合excel_python EXcel表整合(自动办公)

收到任务&#xff0c;方便领导快速查看每个人的日程安排。比如每个工程师都有一个自己的表格记录自己的日程安排&#xff0c;领导查看每个人的日程安排需要一一打开所有工程师的日程安排表才能知道每个人的信息&#xff0c;而且非常不直观。 这里介绍下利用python解决实际办公问…

java poi 打开 保存_Java-Apache POI-在DB中读取和存储RTF内容

我们在Java应用程序中有一个新要求,即用户可以上传excel文件.excel文件中的一列将使用粗体,斜体,项目符号,彩色文本等格式.我们需要读取此excel文件并将这些值存储在Oracle DB表中.随后,我们还需要提取这些数据,并保留格式并下载到excel工作表中.我们计划将Apache-poi用于相同的…

Spring循环依赖的三种方式

引言&#xff1a;循环依赖就是N个类中循环嵌套引用&#xff0c;如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用&#xff0c;直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。 第一种&#xff1a;构造器参数循环依赖 Spring容…

python字典统计排序1_python-如何按字典顺序对Counter.mostCommon(n)的...

这里的问题是Counter dict是无序的,并且most_common不在乎键.为此,您需要对字典中的项目进行排序,然后提取最常见的3个项目. counter Counter(abcdef) most_common sorted(counter.items(), keylambda pair: (-pair[1], pair[0])) 这将首先对-pair [1](计数)进行排序.由于出现…

Java最后_Java最后一次总结

前言&#xff1a;最开始我学习了java如何简单编写一小段代码&#xff0c;发现java代码和C语言还是有很多相似的地方&#xff0c;到类与对象之后等等的很多的内容&#xff0c;我觉得还是有很大区别的&#xff0c;java对于c语言来说&#xff0c;显得更为高级及方便&#xff0c;让…

Spring 是如何解决循环依赖的?

1.由同事抛的一个问题开始 最近项目组的一个同事遇到了一个问题&#xff0c;问我的意见&#xff0c;一下子引起的我的兴趣&#xff0c;因为这个问题我也是第一次遇到。平时自认为对spring循环依赖问题还是比较了解的&#xff0c;直到遇到这个和后面的几个问题后&#xff0c;重…

python3自动化软件发布系统_基于python3做C/S端自动化测试可能用到的工具(不断更新中。。。。)...

选择一个合适的框架(库) (1)如果你的c/s端工具界面控件可以被捕获&#xff0c;则可以使用pyautoit,和pywinauto这2个库&#xff0c;附上界面元素捕获小工具(链接&#xff1a;https://pan.baidu.com/s/1_5--ZWsV-oS7r2ORwX7M7g 提取码&#xff1a;o4z5 ) (2)如果界面控件不可以…

java按钮触发另一个页面_前端跨页面通信,你知道哪些方法?

戳蓝字「前端技术优选」关注我们哦&#xff01; 引言在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页…

【Java用法】java 8两个List集合取交集、并集、差集、去重并集

在业务的开发过程中会经常用到两个List集合相互取值的情况&#xff0c;于是记录在此&#xff0c;方便后续使用哦~~~ public class ListTest {public static void main(String[] args) {ArrayList<String> listA CollectionUtil.toList("a", "b", &…