一. 前言
今天在学习数组的时候,又讲起了冒泡排序,这里将自己的理解和思路整理以下,方便以后学习算法的时候整理。
最新更新时间:2019年3月4日
二. 代码实现
冒泡排序的实现方法有非常多种,这里给出最方便理解的代码:
//从小到大排列 public class Bubble { public static void main(String[] args) { int[] nums = new int[]{5, 7, 3, 0, 1}; for (int i = 0; i < nums.length - 1; i++) { for (int j = 0; j < nums.length - i - 1; j++) { if (nums[j] > nums[j + 1]) { int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } for (int i : nums) { System.out.print(i + " "); } } } //从大到小排列 public class Bubble { public static void main(String[] args) { int[] nums = new int[]{5, 7, 3, 0, 1}; for (int i = 0; i < nums.length - 1; i++) { for (int j = 0; j < nums.length - i - 1; j++) { if (nums[j] < nums[j + 1]) { int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } for (int i : nums) { System.out.print(i + " "); } } }
三. 冒泡讲解
1. 作用
言简意赅,冒泡排序的作用就是将一组乱序的数据,按照顺序排列,比如从小到大排列,或者从大到小排列。
2. 原理
冒泡排序的原理非常简单,从第一个数据开始,依次比较相邻的两个数据,将更大的那个数据向后移动,比如有下面这组数据,我们从小到大将其排列:
int [] nums = new int[] {5,7,3,0,1};
我们首先比较nums[0] 和 nums[1],如果nums[0] > nums[1],那么交换彼此的值,如果nums[0] < nums[1],则不交换
再比较nums[1] 和 nums[2],如果nums[1] > nums[2],那么交换彼此的值,如果nums[1] < nums[2],则不交换
再比较nums[2] 和 nums[3,如果nums[2] > nums[3],那么交换彼此的值,如果nums[2] < nums[3],则不交换
再比较nums[3] 和 nums[4],如果nums[3] > nums[4],那么交换彼此的值,如果nums[3] < nums[4],则不交换
经过上面的第一轮比较后,数组中最大的那个数就被换到了最后,也就是nums[4]的位置,然后继续第二轮比较,第二轮比较结束后,第二大的数被换到了nums[3]的位置,依次类推,排序完成。下面给出具体的图像化步骤
四. 图解冒泡
还是上面的那组数据,首先开始第一次外循环,操作如下:
第一次外循环结束后,最大的数字7被移到了最后,接下来开始第二次外循环,操作如下:
第二次外循环结束后,除了7之外,最大的数字5被移到了最后,但是这里有个问题,就是第一次外循环中,内循环执行了四次,为什么第二次外循环的内循环只执行了三次呢?我们首先来看一下内循环的代码:
for(int j = 0; j < nums.length - i - 1; j++)
通过代码我们可以看出,每次外循环,最大的数都已经放在了最后,其他的数不需要再次和7比较了,所以每次内循环次数会逐渐减少。接下来开始第三次外循环,操作如下:
最后进行第四次外循环,排列结束:
请登录之后再进行评论