冒泡排序(Bubble Sort)
之前大一的时候学的第一个排序就是冒泡排序,那时候用的是C语言,现在用java语言复习一下做个笔记,欢迎批评指点错误。
作用:
排序,就是将几个数从小到大或者从大到小的顺序排列。就像小学生排队回家一样(ps:小学生除了会排位,还是会排队的),他们可以从高的到矮的排队,也可以从矮到高的排队。冒泡排序算法就是把混乱的队排整齐的。
思路:
1、依次对相邻的两个数字对比,如果第一个前面的数字比后面的数字大,那么两个数字就交换,也就是将大的数字放在后面(这里拿从小到大的顺序排序)。比如:首先比较第1个数和第2个数,将这两个数中较大的放在第2个,较小的放在第1个;然后比较第2个和第2个数,将这两个数中较大的放在第3个,较小的放在第2个。
2、这样一趟下来,要排序的数中最大的数就被放到了最后一个。
3、第二趟还重复1中的步骤,但是不要比较最后一个(因为最后一个已经是最大的了,但是每次都比较所有的数也是可以的,但是效率就不高了,所以这样没必要,,,真的没必要。(!!-_-))。
4、第三趟也是重复1中的步骤,但是不要比较最后两个了。。
5、以此类推。
举例:
1、假设有6个小朋友他们的身高分别为{6,3,2,1,5,4},我们用冒泡排序的方法对他们进行从矮到高的排队(下图每个方块代表一个小朋友,里面的数字代表他们的身高)。
//用java程序表示就是一个数组 int[] student= {6,3,2,1,5,4};
2、第一轮排序:
第一次:我们首先对第1个和第2个小朋友身高进行比较,我们发现第1个小朋友比第2个小朋友高,所有就将第1个小朋友放到第2位去。
//用java表示就是一个for语句,其中用i=0的时候是第一轮排序,i=1时候是第二轮排序;而比较就是一个if的条件语句 for(int i=0;i<6;i++){ }
第二次:然后我们对上面排好的小朋友再比较,这次我们将第2个小朋友跟第3个小朋友比较,我们发现:第2个小朋友,明显比第3个小朋友高,所有我们又把他往后排(用代码表示就是一个if语句加上一个交换变量值的式子)。(甭管他愿不愿意,谁叫他长这么高的。)
//用j表示每次循环中的对比次数,对此次数每轮都减少i个,因为每轮结束后当前最高的小朋友就被排到最后了,就不用管他了(规律是:第1轮减少0个,第二轮减少1个) for(int i=0;i<6;i++){ for(int j=1;j<6-i-1;j++) { } }
然后是第三次比较,第四次比较等等都是相同的。。。。。。。。。(整理一下第一轮的排序如下图)
由图可知,我们第一轮就将长的最高的那位小朋友排到了最后。然后就不用管他了,因为他已经呆在了正确的位置了,接下来他只要看着前面五个小朋友被拉过来拉过去的排队就行了。
图中的那个最高的小朋友是不是像水泡一样,从锅底,一步步的冒到了最上面(把第一位置想想成锅底,最后一个位置想想程最上面)
接下来只要再进行4轮同样的对比和交换就可以将剩下的小朋友排好了
代码实现:
public static void main(String[] args) { //用程序表示就是一个数组 int[] student= {6,3,2,1,5,4}; //用java表示就是一个for语句,其中用i=0的时候是第一轮排序,i=1时候是第二轮排序 for(int i=0;i<6;i++) { //用j表示每次循环中的对比次数,对此次数每轮都减少i个,因为每轮结束后当前最高的小朋友就被排到最后了,就不用管他了(规律是:第1轮减少0个,第二轮减少1个) for(int j=0;j<6-i-1;j++) { //用下面的if语句进行对比,并进行交换 int middle=0; if(student[j]>student[j+1]) { //位置交换代码 middle=student[j]; student[j]=student[j+1]; student[j+1]=middle; } } } }
代码优化一下:
public class BubbleSort { public static void main(String[] args) { int[] student= {6,3,2,1,5,4,213,124,2}; for(int i=1;i<6;i++) { for(int j=0;j<student.length-i;j++) { if(student[j]>student[j+1]) { student[j]=student[j]+student[j+1]; student[j+1]=student[j]-student[j+1]; student[j]=student[j]-student[j+1]; } } } for(int i=0;i<student.length;i++) { System.out.print(student[i]+" "); } } }
欢迎大佬给出建议。。。。