网站首页 > java教程 正文
冒泡排序介绍
冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。
它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!
下面以数列{20,40,30,10,60,50}为例,演示它的冒泡排序过程(如下图)。
冒泡排序的时间复杂度和稳定性
冒泡排序时间复杂度
冒泡排序的时间复杂度是O(N2)。
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次!因此,冒泡排序的时间复杂度是O(N2)。
冒泡排序稳定性
冒泡排序是稳定的算法,它满足稳定算法的定义。
算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!
冒泡排序Java实现
import java.util.Arrays; /** * by 沐兮沐楚 * 冒泡排序(bubble sort):此例实现升序排序 * 简易版:每个数都与其它数比较大小 * 优化版:减少每趟次数,之前比较过的不再比较 * 最终版:考虑有序,减少趟数 */ public class bubbleSort { public static void main(String[] args) { int[] arr = {20,40,30,60,50}; sort1(arr); arr = new int[] {20,40,30,60,50}; //重置 sort2(arr); arr = new int[] {20,40,30,60,50}; sort3(arr); } /** * 简易版simple */ public static void sort1(int[] arr) { System.out.println("*************简易版simple*************"); int len = arr.length; for(int i = 0; i < len-1; i++) { System.out.println("第" + (i+1) + "趟"); for(int j = 0; j < len-1; j++) { System.out.print("第" + (j+1) + "次"); if(arr[j] > arr[j+1]) { int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } System.out.println(Arrays.toString(arr)); } } } /** * 优化版optimized */ public static void sort2(int[] arr) { System.out.println("*************优化版optimized*************"); int len = arr.length; for(int i = 0; i < len-1; i++) { System.out.println("第" + (i+1) + "趟"); for(int j = 0; j < len-1-i; j++) {//次数,-i减少每趟次数 System.out.print("第" + (j+1) + "次"); if(arr[j] > arr[j+1]) { int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } System.out.println(Arrays.toString(arr)); } } } /** * 最终版final */ public static void sort3(int[] arr) { System.out.println("*************最终版final*************"); int len = arr.length; boolean issort = true; for(int i = 0; i < len-1; i++) { issort = true;//假定有序 System.out.println("第" + (i+1) + "趟"); for(int j = 0; j < len-1-i; j++) { System.out.print("第" + (j+1) + "次"); if(arr[j] > arr[j+1]) { int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; issort = false;//有交换,假定失败 } System.out.println(Arrays.toString(arr)); } if(issort) { break; } } } } |
执行结果:
*************简易版simple************* 第1趟 第1次[20, 40, 30, 60, 50] 第2次[20, 30, 40, 60, 50] 第3次[20, 30, 40, 60, 50] 第4次[20, 30, 40, 50, 60] 第2趟 第1次[20, 30, 40, 50, 60] 第2次[20, 30, 40, 50, 60] 第3次[20, 30, 40, 50, 60] 第4次[20, 30, 40, 50, 60] 第3趟 第1次[20, 30, 40, 50, 60] 第2次[20, 30, 40, 50, 60] 第3次[20, 30, 40, 50, 60] 第4次[20, 30, 40, 50, 60] 第4趟 第1次[20, 30, 40, 50, 60] 第2次[20, 30, 40, 50, 60] 第3次[20, 30, 40, 50, 60] 第4次[20, 30, 40, 50, 60] *************优化版optimized************* 第1趟 第1次[20, 40, 30, 60, 50] 第2次[20, 30, 40, 60, 50] 第3次[20, 30, 40, 60, 50] 第4次[20, 30, 40, 50, 60] 第2趟 第1次[20, 30, 40, 50, 60] 第2次[20, 30, 40, 50, 60] 第3次[20, 30, 40, 50, 60] 第3趟 第1次[20, 30, 40, 50, 60] 第2次[20, 30, 40, 50, 60] 第4趟 第1次[20, 30, 40, 50, 60] *************最终版final************* 第1趟 第1次[20, 40, 30, 60, 50] 第2次[20, 30, 40, 60, 50] 第3次[20, 30, 40, 60, 50] 第4次[20, 30, 40, 50, 60] 第2趟 第1次[20, 30, 40, 50, 60] 第2次[20, 30, 40, 50, 60] 第3次[20, 30, 40, 50, 60] |
- 上一篇: 再说,数组(数组mem)
- 下一篇: 冒泡排序在JAVA、C以及PHP中的实现详解
猜你喜欢
- 2024-09-25 Java数组的排序冒泡排序选择排序二种冒泡逆排序
- 2024-09-25 java冒泡排序(Java冒泡排序算法)
- 2024-09-25 好程序员Java学习路线分享冒泡排序及优化
- 2024-09-25 五分钟学会一个初级算法:冒泡排序
- 2024-09-25 Java冒泡排序-大白话解释(java冒泡排序的方法代码)
- 2024-09-25 C#基础语法循环篇:冒泡排序算法讲解(附源码)
- 2024-09-25 排序算法之冒泡排序(冒泡排序 算法)
- 2024-09-25 经典排序算法之——冒泡排序(冒泡排序算法实例)
- 2024-09-25 Java十大排序算法之冒泡排序(java冒泡排序和快速排序)
- 2024-09-25 JAVA手写算法 | 冒泡排序算法(java简单冒泡排序写法)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)