3f2f9450667bce57b284a92e1032ef43.png

不管学习什么编程语言,冒泡排序都是每一个走上IT路的小伙伴的必经之路。但是还有好多小伙伴对冒泡排序摸不着头脑,今天知了堂小编就来分享一下经典算法——冒泡排序。

首先咱们举个金鱼吐泡泡的例子来理解冒泡排序的过程:金鱼吐出的一连串泡泡就是我们要排序的数据,数据就像泡泡浮上水面一样一个一个被排好序,吐出的泡泡越大就会越快浮出水面,相应的,数据里某一个数字越大,那么就能越快的被排好序,当然最大的数字也是第一个被排好顺序的。

但是冒泡排序究竟是怎么比较数字的大小来排序的呢?其实冒泡排序的原理很简单,把两个挨在一起的数字进行比较大小,大数放在后面,较小的数放在前面。每遍历一次数据,就将一个最大的数放在整个数据的末尾,当遍历结束后,整个数据就被排好了序。

有小伙伴看到这里或许会问了:“怎么知道冒泡排序要遍历多少遍呢?”咱们还是根据冒泡排序的原理来判断,每两个数字就要比较一次,那么三个数字就要比较两次,依次排下去可以得到一个结论:如果一个数据有n个元素,那么冒牌排序就需要对数据遍历n-1次。

接下来咱们假设有一串数字需要从小到大排序,给大家用数据和图片演示一次。以下图的数据为例,可以得知5个数字需要遍历4次。

2df318b817997fed669de11950fdb239.png

第一次遍历:(1)17与5比较,17>5,这时最大的数是17,那么17与5交换;(2)17与20比较,17<20,此时最大的数变成了20,20与17交换;(3)20与8比较,20>8,20与8交换;(4)20与11比较,20>11,20与11交换。因此,第一次遍历后得到最大数为20,排序结果为下图。

3325da687992c0a3135e6038112bca83.png

由于第一次遍历时,最大值20已经排在末尾,因此在第二次遍历时,就不需要再比较20。

第二次遍历:(1)5与17比较,5<17,最大值为17,顺序不变;(2)17与8比较,17>8,17与8交换;(3)17与11比较,17>11,17与11交换。第二次遍历后得到此次遍历中的最大值17,的结果为下图。

ad2e62781c025f1d199892630b91a667.png

经过两次遍历后,我们发现数据的顺序已经按由大到小排序了,但是计算机并不知道,所以之后的两次遍历依旧会按照刚才的排序方法进行,但是没有数字会改变位置,直到遍历结束。

小伙伴们也可以看看下面的动图,让思路更加清晰。

13a6d0ebe06f46f5031013b604f1ad59.png

根据上面咱们分享的冒泡排序的过程,可以总结出以下在使用冒泡排序时需要注意的地方:

1、 有n个数,就需要进行n-1次遍历。

2、 每一次遍历都是一个循环,由于每次遍历都需要将数据两两比较,因此在大循环下还有一个小循环。

3、 在每一次遍历结束之后,都会找到一个当前的最大值,这个最大值在结束遍历时的位置是固定的,因此接下来的遍历不需要再比较这个最大值,所以每个小循环的次数都会比上一次小循环的次数-1。

相信小伙伴们已经懂得了冒泡排序的原理和排序逻辑,那么下面用代码给小伙伴们分享Java代码是如何实现冒泡排序的。

public class BubbleSort {
	public  static void bubbleSort(int[] arr) {
		if (arr==null||arr.length==1) 
			return;
		for (int i = 0; i < arr.length-1; i++) {
			boolean isSorted=true;
			for (int j = 0; j < arr.length-i-1; j++) {
				if(arr[ j ]>arr[ j+1 ]) {
					int temp=arr[ j ];
					arr[ j]=arr[ j+1];
					arr[ j+1]=temp;
					isSorted=false;
				}
			}
		if(isSorted)
			return;
		System.out.print("第"+(i+1)+"次遍历结果:");
		print(arr);
		}
	}
	public static void main(String[] args) {
		int[] arr= {17,5,20,8,11};
		System.out.print("排序前的顺序为:");
		print(arr);
		bubbleSort(arr);
		System.out.print("排序后的顺序为:");
		print(arr);
	}
	private static void print(int[] arr) {
		if (arr==null)
			return;
		for (int i :arr) {
			System.out.print(i+" ");
		}
		System.out.println();
	}
}

看完之后是不是觉得冒泡排序一下就变得简单了?今天的分享就到这里了,想获取更多Java干货和行业知识,关注我们哦~

fc5aa4c21072d0c32fe66bdb6cdf8eb2.png