图解Java经典算法冒泡排序的原理与实现
目录
- 冒泡排序
- 算法原理
- 动图演示
- 算法练习
- 算法分析
冒泡排序
冒泡排序是一种比较简单的排序算法,我们可以重复遍历要排序的序列,每次比较两个元素,如果他们顺序错误就交换位置,重复遍历到没有可以交换的元素,说明排序完成。
算法原理
- 从第一个元素开始,比较相邻的两个元素,如果第一个大于第二个,则交换它们
- 对每一对相邻的元素做相同的操作,从第一对到最后一对,最终最后一位元素就是最大值
- 对每一个元素重复上述步骤,最后一个除外
动图演示

算法练习
题目描述: 给定一个无序数组,利用冒泡排序将数组按升序排列。
示例一:
输入: arrs= [5,0,9,3,-1,12]
输出: arrs= [-1,0,3,5,9,12]
示例二:
输入: arrs= [3,5,9,7,2,1]
输出: arrs= [1,2,3,5,7,9]
解题思路:
通过比较相邻的元素,如果前一个比后一个大,则交换位置。
- 第一趟:比较第1个和第2个元素,然后是第2个和第3个比较,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。
- 第二趟:重复上面步骤,将第二大的数交换至倒数第二位。
…
- 每一趟都会将元素中第 n 大的元素交换到倒数第 n 位。
- 一共需要n-1趟。
代码实现:
public class BubbleTest {
public static void main(String[] args) {
Integer[] arr = {3,5,9,7,2,1};
Bubble.sort(arr);
System.out.println(Arrays.toString(arr));
}
//数组排序
public static void bubblesort(Comparable[] a){
for (int i = a.length - 1;i > 0;i--){
for (int j = 0;j < i;j++){
if (greater(a[j],a[j + 1])){
swap(a,j,j + 1);
}
}
}
}
//比较 v 是否大于 w
public static boolean greater(Comparable v,Comparable w){
return v.compareTo(w) > 0;
}
//数组元素交换位置
private static void swap(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
算法分析
时间复杂度
冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。
而对于有n个元素的数列它的比较次数为 (n-1) + (n-2) + … + 1 = n * (n - 1) / 2;因此它的时间复杂度为O(n^2)。
空间复杂度
冒泡排序的辅助变量只是一个临时变量,不会随数组规模的增大而增大,所以冒泡排序的空间复杂度为O(1)。
到此这篇关于图解Java经典算法冒泡排序的原理与实现的文章就介绍到这了,更多相关Java冒泡排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
Java冒泡排序及优化介绍
目录 什么是冒泡排序 思路分析 代码实现 结果输出 代码优化 优化后的结果输出 什么是冒泡排序 冒泡排序指重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从小到大)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名"冒泡排序". 思路分析 以{5,3,9,7
-
排序算法图解之Java冒泡排序及优化
目录 1.冒泡排序简介 2.图解算法 3.冒泡排序代码实现 4.冒泡排序算法的优化 1.冒泡排序简介 冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的元素逐渐移动到后部,就像水底的气泡一样逐渐从水面冒出来,这就是冒泡名称的由来 2.图解算法 以将序列{3, 9, -1, 10, -20}从小到大排序为例! 基本思想就是,在每一趟排序实现将最大的数移到序列的最后端!这主要通过比较相邻两个元素实现,当相邻的两个元素逆序的时候
-
Java实现冒泡排序示例介绍
何为冒泡排序 冒泡:就像气泡从水中冒出来一样 在冒泡排序中,最小数或最大数取决于您是按升序还是降序对数组进行排序,向上冒泡到数组的开头或结尾. 算法描述: 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数: 针对所有的元素重复以上的步骤,除了最后一个: 重复步骤1~3,直到排序完成. 如果两个元素相等,不会再交换位置,所以冒泡排序是一种稳定排序算法. 代码实现: 数组排序 /* 对数组a中的元素进
-
Java实现冒泡排序
问题描述 利用冒泡排序把一列数组按从小到大或从大到小排序 (一).冒泡排序思想 以从小到大为例: 1.第一轮的冒泡,从第一个数开始,与相邻的第二个数相比,若第一个数更大,则交换一二的位置,反之不动,结束后进行二三位置两个数的比较,同理如此反复,直到把最大的一个数排到最后一个位置. 2.进行第二轮的冒泡,依旧从第一个数开始,依次比较当前的一二.二三······位置的数,直到把第二大的数排到倒数第二位. 3.如此循环进行,直到所有数按从小到大排列. (二).问题分析 1.输入数组 根据用户输入的进行
-
Java最简洁数据结构之冒泡排序快速理解
目录 一.什么是冒泡排序 二.图解冒泡排序 三.代码实现 四.代码的优化 1.整体的思路 2.代码示例 一.什么是冒泡排序 冒泡排序的英文是bubble sort,它是一种基础的交换排序.说到冒泡是不是就想起了快乐肥宅水呢?汽水中有许多小小的水泡哗啦哗啦的浮到上面来.这是因为组成小气泡的二氧化碳比水轻,所以小气泡可以一点一点地向上浮动. 而冒泡排序之所以叫冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身的大小,一点一点的向着数组的一侧移动. 二.图解冒泡排序 我们先看一个例
-
详解Java之冒泡排序与选择排序
目录 一.冒泡排序 1.概念 2.图解 3.代码的思路 4.代码例子 二.选择排序 1.概念 2.图解 3.代码的思路 总结 一.冒泡排序 1.概念 冒泡排序这种排序方法其实关键词就在于冒泡两个字,顾名思义就是数字不断比较然后最大的突出来,也就是说把相邻的两个数字两两比较,当一个数字大于右侧相邻的数字时,交换他们的位置,当一个数字和他右侧的数字小于或等于的时候,不交换. 2.图解 关于冒泡排序我自己画了一幅图来描述他的一轮过程 这里我举了五个无序的数{7,3,6,5,4} 由此可看出他不断与右侧
-
Java 十大排序算法之冒泡排序刨析
目录 冒泡排序原理 冒泡排序API设计 冒泡排序的代码实现 冒泡排序的时间复杂度分析 冒泡排序原理 ①比较相邻的元素,如果前一个元素比后一个元素大,则交换这两个元素的位置 ②对每一对相邻的元素循环上面的步骤,最终最后面的元素就是最大值 冒泡排序API设计 类名 Bubble 构造方法 Bubble:创建Bubble对象 成员方法 1.public static void sort(Comparable[] a):对数组内元素进行排序 2.private static void greater(C
-
图解Java经典算法快速排序的原理与实现
目录 快速排序 算法原理 图解 Java代码实现 算法分析 快速排序 通过一趟排序将待排元素分成独立的两部分,其中一部分为比基准数小的元素,另一部分则是比基准数大的元素.然后对这两部分元素再按照前面的算法进行排序,直到每一部分的元素都只剩下一个. 本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法. 算法原理 从数列中挑出一个元素作为基准点 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 然后基准值左右两边,重复上述步骤 通过递归把基准值元素左右两侧的
-
图解Java经典算法归并排序的原理与实现
目录 归并排序 算法原理 动图演示 代码实现 复杂度 归并排序 归并排序主要分成两部分实现,分.合两部分,分是把数组分成两半,再递归的对子数组进行 分 操作,直到分成一个个单独的数.合是把两个数组合并为有序数组,在对有序数组进行合并,直到全部子数组合并为一个完整的数组. 算法原理 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤c直
-
图解Java经典算法插入排序的原理与实现
目录 一.算法介绍 二.算法思想 三.算法原理 四.动图演示 五.代码实现 六.算法分析 6.1 时间复杂度 6.2 空间复杂度 一.算法介绍 插入排序,也称为直接插入排序.插入排序是简单排序中效率最好的一种,它也是学习其他高级排序的基础,比如希尔排序/快速排序,所以非常重要,而它相对于选择排序的优点就在于比较次数几乎是少了一半. 二.算法思想 每次将待排序的元素插入到已排序的序列中,直至全部插入完成. 三.算法原理 把所有元素分为两个序列,将第一待排序序列第一个元素看做一个有序序列,把第二个元
-
图解Java经典算法冒泡选择插入希尔排序的原理与实现
目录 一.冒泡排序 1.基本介绍 2.代码实现 二. 选择排序 1.基本介绍 2.代码实现 三.插入排序 1.基本介绍 2.代码实现 四.希尔排序 1.基本介绍 2.代码实现(交换排序) 3.代码实现(移位排序) 一.冒泡排序 1.基本介绍 冒泡排序是重复地走访要排序的元素,依次比较两个相邻的元素,如果它们的顺序与自己规定的不符合,则把两个元素的位置交换.走访元素重复地进行,直到没有相邻元素需要交换为止,完成整个排序过程. 算法原理 1.比较相邻元素,如果前一个元素大于后一个元素,则交换. 2.
-
图解Java经典算法希尔排序的原理与实现
目录 希尔排序 算法思想 图解 代码实现(Java) 希尔排序 希尔排序时插入排序的一种,也称缩小增量排序,是直接插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 算法思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的数越来越多当增量减至1时,整个序列恰好被分成一组,算法完成. 我们以增序排序为例,希尔排序基本步骤:选择初始增量gap=length/2,缩小增量继续以gap=gap/2的方式进行,直到增量gap=1为止,增量的每次变
-
Java经典设计模式之适配器模式原理与用法详解
本文实例讲述了Java经典设计模式之适配器模式.分享给大家供大家参考,具体如下: 适配器模式是把一个类的接口适配成用户所期待的,使得原本由于接口不兼容而不能一起工作的一些类可以在一起工作从而实现用户所期望的功能. 适配器模式的优势: 1. 通过适配器,客户端可以调用统一接口,操作简单直接,并且代码逻辑紧凑,使用起来方便. 2. 代码复用,适配器模式就是解决因为环境要求不相同 的问题,通过适配实现代码复用. 3. 将目标类和适配器类解耦,通过新建一个适配器类来重用现在的类,不用再去重复修改原有代码
-
Java经典设计模式之观察者模式原理与用法详解
本文实例讲述了Java经典设计模式之观察者模式.分享给大家供大家参考,具体如下: 观察者模式:对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察). 以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并发生相应的变化. 观察者模式有很多实现方式:该模式必须包含观察者和被观察对象两种角色.观察者和被观察者之间存在"观察"的逻辑关系,当被观察者发生改变的时候,观察者就会观察到这样的变化,发出相应的改变. /** * 观察者接口:观察者,需要用到观察者模式的
-
Java经典算法汇总之冒泡排序
原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[]arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:368291 第二次排序:6和8比较,6小于8,不交换位置:36
-
Java经典算法汇总之顺序查找(Sequential Search)
a)原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b)图例说明: 原始数据:int[]a={4,6,2,8,1,9,0,3}; 要查找数字:8 找到数组中存在数据8,返回位置. 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg) { int[] a={4,6,2
-
图解Java排序算法之希尔排序
目录 基本思想 代码实现 总结 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插入排序很循规蹈
随机推荐
- Ruby中的p和puts的使用区别浅析
- IOS开发之tableView点击行跳转并带有“显示”更多功能
- Jdk1.8 HashMap实现原理详细介绍
- 深入掌握include_once与require_once的区别
- Python常用列表数据结构小结
- 详解 Python 读写XML文件的实例
- Android闹钟设置的解决方案
- jQuery 中DOM 操作详解
- jQuery实现的仿百度分页足迹效果代码
- 基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
- VBS教程:属性-SubFolders 属性
- 用expect实现ssh自动登录服务器并进行批量管理的实现方法
- JavaScript获取当前url根目录(路径)
- 一个简单的瀑布流效果(主体形式自写)
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- JavaScript中实现sprintf、printf函数
- 解析Android开发中多点触摸的实现方法
- 基于Android实现桌面悬浮清内存app概述
- Android编程实现仿心跳动画效果的方法
- Python排序搜索基本算法之冒泡排序实例分析
