不管学习什么编程语言,冒泡排序都是每一个走上IT路的小伙伴的必经之路。但是还有好多小伙伴对冒泡排序摸不着头脑,今天知了堂小编就来分享一下经典算法——冒泡排序。
首先咱们举个金鱼吐泡泡的例子来理解冒泡排序的过程:金鱼吐出的一连串泡泡就是我们要排序的数据,数据就像泡泡浮上水面一样一个一个被排好序,吐出的泡泡越大就会越快浮出水面,相应的,数据里某一个数字越大,那么就能越快的被排好序,当然最大的数字也是第一个被排好顺序的。
但是冒泡排序究竟是怎么比较数字的大小来排序的呢?其实冒泡排序的原理很简单,把两个挨在一起的数字进行比较大小,大数放在后面,较小的数放在前面。每遍历一次数据,就将一个最大的数放在整个数据的末尾,当遍历结束后,整个数据就被排好了序。
有小伙伴看到这里或许会问了:“怎么知道冒泡排序要遍历多少遍呢?”咱们还是根据冒泡排序的原理来判断,每两个数字就要比较一次,那么三个数字就要比较两次,依次排下去可以得到一个结论:如果一个数据有n个元素,那么冒牌排序就需要对数据遍历n-1次。
接下来咱们假设有一串数字需要从小到大排序,给大家用数据和图片演示一次。以下图的数据为例,可以得知5个数字需要遍历4次。
第一次遍历:(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,排序结果为下图。
由于第一次遍历时,最大值20已经排在末尾,因此在第二次遍历时,就不需要再比较20。
第二次遍历:(1)5与17比较,5<17,最大值为17,顺序不变;(2)17与8比较,17>8,17与8交换;(3)17与11比较,17>11,17与11交换。第二次遍历后得到此次遍历中的最大值17,的结果为下图。
经过两次遍历后,我们发现数据的顺序已经按由大到小排序了,但是计算机并不知道,所以之后的两次遍历依旧会按照刚才的排序方法进行,但是没有数字会改变位置,直到遍历结束。
小伙伴们也可以看看下面的动图,让思路更加清晰。
根据上面咱们分享的冒泡排序的过程,可以总结出以下在使用冒泡排序时需要注意的地方:
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干货和行业知识,关注我们哦~