(纯白话算法系列)冒泡排序、时间复杂度分析、代码演示

本文主要是介绍(纯白话算法系列)冒泡排序、时间复杂度分析、代码演示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义:

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

纯白话说:就是从左往右一对一对的进行比较,如果左边的比右边的数字大,那就进行交换,如果左边的数比右边的小,那么就保持现在的位置:

看一下动态图:

--本图摘自https://www.cnblogs.com/xuyiyixuan/p/7047191.html

看一下代码的实现,非常之简单:

package com.bean.bubble_sort;import java.util.Arrays;public class BubbleSorted {public static void bubbleSort(int arr[]) {if (arr == null || arr.length < 2) {return;//如果数组为空比个锤子,数组中只有一个数也没意义,不用比较}for (int end = arr.length-1; end > 0; end--) {//这是每次循环的终止点,下文会详细说for (int i = 0; i < end; i++) {//表示从0到end依次比较if (arr[i] > arr[i+1]) {swap(arr, i, i+1);//左边的数字大就换位置}}}}//就是单纯的换位置(Tip:因为参数是数组,所以可以改变数组的值,如果是八大基本数据类型或者String就不行了,这是数组的特性)public static void swap(int[] arr, int left, int right) {int temp = arr[left];arr[left] = arr[right];arr[right] = temp;}public static void main(String[] args) {int arr[] = {3,1,5,0,5,9,8,11};//测试数据bubbleSort(arr);System.out.println(Arrays.toString(arr));}
}

打印结果。

 

为了更直观,我把测试数据缩短为:[3,1,5,0]

3,1,5,0--->每次循环都是从0到end,那么end为什么等于arr.length-1,并且一直自减呢?

因为冒泡排序是每次排序把最大的就排到最后的位置了,所以第一次排序需要比较的一定是0-arr.length-1,这个例子只有四个元素,所以需要比较3次,等到最大的数字冒泡到了最后一位,下一次循环比较2次,等本次最大的数字到了最后一位的时候,再比较一次,本次比较结束,即排序结束

第一次循环

1350(3大于1,所以交替位置)-->1350(3小于5,所以不变)-->1305(5大于0,所以交替位置)本次循环结束

第二次循环

1305(1小于3,所以不变)-->1035(3大于0,所以交替位置)本次循环结束

第三次循环

0135(1大于0,所以交替位置)本次循环结束

Debug一下,看看这个效果是怎么样的:

再说一下它的时间复杂度:

由于外层循环是从

0........N-1     第一次执行了N次

0....N-2         第二次执行了N-1次

0..N-3           第三次执行了N-2次

而且方法内部执行的操作都是常数级别的,外层循环又是一个等差数列,写成na1+n(n-1)d/2,可以理解成ax²+bx+c,时间复杂度只要高阶不要低阶和常数项,所以时间复杂度为O(n²)

 

这篇关于(纯白话算法系列)冒泡排序、时间复杂度分析、代码演示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN