数据结构系列:图文详解冒泡排序 & 优化
时间:2022-07-28
本文章向大家介绍数据结构系列:图文详解冒泡排序 & 优化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
本文主要讲解排序算法中最简单的冒泡排序算法,希望你们会喜欢。
目录
1. 简介
属于 内排序算法中 的 交换排序类别
2. 算法思想
- 自下而上对 相邻的2个数依次 比较 & 调整
- 若 反序 则交换,直到 无反序的记录 为止。
较大的数往下沉,较小的数类似气泡一样往上冒,故称:冒泡排序
3. 算法示意图
整个过程就跟冒泡一样,最小值一直往上“冒泡”,具体如下:
a. 2与6对比:因2<6,所以交换位置
b. 2与4对比:因2<4,所以交换位置
c. 2与7对比:因2<7,所以交换位置
以此类推,最终将序列中最小值放到了首位(冒上来了)
4. 算法实现
4.1 具体代码
具体请看注释
public class BubbleSort {
/**
* 基本的 冒泡排序
*/
public static void bubbleSort(int[] srcArray) {
int i,j; // 用于存放数组下标
int temp = 0; // 用于交换数值时临时存放值
for(i=0;i<srcArray.length-1;i++){
// j 从后往前循环
for(j=srcArray.length-2;j>=i;j--){
// 若前者>后者,则交换位置
if(srcArray[j]>srcArray[j+1]){
temp=srcArray[j];
srcArray[j]=srcArray[j+1];
srcArray[j+1]=temp;
}
}
}
// 输出排序后的序列
for(int a =0;a<srcArray.length;a++)
System.out.println(srcArray[a]);
}
/**
* 执行 冒泡排序
*/
public static void main(String[] args) {
// 定义待排序数列
int[] src = new int[]{9, 1, 5, 8, 3, 7, 4, 2, 6};
// 输出结果
bubbleSort(src);
}
}
4.2 算法示意图
- 当 i =0时,算法示意图如下:
- 当 i =1时,算法示意图如下:
- i = 2、3、4依次类推…
4.3 最终测试结果
1
2
3
4
5
6
7
8
9
-
Demo
地址 Carson_Ho的Github地址:冒泡排序
5. 算法优化
- 简介
- 具体实现
public class BubbleSort {
/**
* 优化的 冒泡排序
*/
public static void bubbleSortOpti(int[] srcArray) {
int i,j; // 用于存放数组下标
int temp = 0; // 用于交换数值时临时存放值
// 标记位
// flag = true:代表存在数据交换,即序列仍需排序,需继续循环
// flag = false:代表不存在数据交换,即序列不需排序,已经是有序序列了,可停止循环
Boolean flag = true;
// 若flag = false时退出循环
for(i=0;i<srcArray.length-1 && flag;i++){
flag = false; // 初始化为false
// j 从后往前循环
for(j=srcArray.length-2;j>=i;j--){
// 若前者>后者,则交换位置
if(srcArray[j]>srcArray[j+1]){
temp=srcArray[j];
srcArray[j]=srcArray[j+1];
srcArray[j+1]=temp;
flag = true; // 若有数据交换,则说明序列仍未无序
}
}
}
// 输出排序后的序列
for(int a =0;a<srcArray.length;a++)
System.out.println(srcArray[a]);
}
/**
* 执行 优化后的冒泡排序
*/
public static void main(String[] args) {
// 定义待排序数列
int[] src = new int[]{2, 1, 3, 4, 5, 6, 7, 8, 9};
// 输出结果
bubbleSortOpti(src);
}
}
6. 性能分析
以下将分析算法的性能:时间复杂度、空间复杂度、稳定性
7. 总结
- 本文主要讲解了 排序算法中 的冒泡排序
- 下面我将继续讲解 数据结构,有兴趣可以继续关注Carson_Ho的安卓开发笔记
- 如何使用CDSW在CDH中分布式运行所有R代码
- 如何在CDH中使用HBase快照
- 中间件安全-Tomcat安全测试概要
- 如何在CDH集群使用HDFS快照
- Sentry赋予server1权限给hive以外用户时ACL不同步问题分析
- 如何使用Java连接Kerberos的HBase
- 香香的xss小记录(一)
- UAF Writeup - pwnable.kr
- 如何使用Nginx实现Impala负载均衡
- pwnhub年前最后一战——“血月归来”writeup
- MHN中心服务器搭建与树莓派蜜罐部署
- 如何在CDH中启用Spark Thrift
- 让你的以太坊 DApps 盈利的 6 种方法
- 赛博地球杯初赛第三名,ChaMd5安全团队的writeup
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- istio的安全(概念)
- 面试题系列第5篇:JDK的运行时常量池、字符串常量池、静态常量池,还傻傻分不清?
- Go by Example 中文版: 互斥锁
- Idea初始化配置大全,以后重装再也不用各种百度了
- 使用这种技巧,可以大大地提高前端布局效率
- Element-UI表格组件实现行拖拽排序
- Vue自定义指令实现拖拽功能
- 小程序 Canvas 层级问题
- JDK 8 新特性之函数式编程 → Stream API
- golang 单元测试框架实践
- 想要成为前端Star 吗?一首歌时间将React/Vue 应用Docker 化
- 60亿次for循环,原来这么多东西
- 不要再问我 in,exists 走不走索引了...
- 知乎太可恶了,一言不合就封号?
- 5年Java开发经验,面试挂在MySQL InnoDB上!大厂究竟多看重MySQL?