大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。
而我们的冒泡排序之所以叫做冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。
时间复杂度:最好 O(n) 最坏O(n2)
1.1. 原理
比较两个相邻的元素,将值大的元素交换至右端。
1.2. 思路
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
依次类推,每一趟比较次数-1;
……
具体如何来移动呢?让我们来看一个栗子:
有8个数组成一个无序数列:5,8,6,3,9,2,1,7,希望从小到大排序。
按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置,过程如下:
首先让5和8比较,发现5比8要小,因此元素位置不变。
接下来让8和6比较,发现8比6要大,所以8和6交换位置。
继续让8和3比较,发现8比3要大,所以8和3交换位置。
继续让8和9比较,发现8比9要小,所以元素位置不变。
接下来让9和2比较,发现9比2要大,所以9和2交换位置。
接下来让9和1比较,发现9比1要大,所以9和1交换位置。
最后让9和7比较,发现9比7要大,所以9和7交换位置。
这样一来,元素9作为数列的最大元素,就像是汽水里的小气泡一样漂啊漂,漂到了最右侧。
这时候,我们的冒泡排序的第一轮结束了。数列最右侧的元素9可以认为是一个有序区域,有序区域目前只有一个元素。
至于后续的交换细节,我们这里就不详细描述了,第二轮过后的状态如下:
第三轮过后的状态如下:
第四轮过后状态如下:
第五轮过后状态如下:
第六轮过后状态如下:
第七轮过后状态如下(已经是有序了,所以没有改变):
第八轮过后状态如下(同样没有改变):
到此为止,所有元素都是有序的了,这就是冒泡排序的整体思路。
由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-1-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即
for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-i-1;j++){ //判断是否需要交换位置,是则交换 }
1.3. 完整代码
public class Main { public static void main(String[] args) { //定义数组 int[] num={1,5,3,8,4,9}; //第一层循环 for(int i=0;i<num.length-1;i++) { //第二层循环 for(int j=0;j<num.length-1;j++) { //判断第一个数是否比第二个数大 if(num[j]>num[j+1]) { //如果是则交换 int temp=num[j]; num[j]=num[j+1]; num[j+1]=temp; } } } //输出 System.out.println("排序后的数组为:"); for(int i=0;i<num.length;i++) { System.out.println(num[i]); } } }
缺点1:每一趟比较都要比较到数组的最后,没有必要,只要比较到无序数列最后即可
缺点2:不管是否有序,都要进行n-1趟循环;
优化后的代码:
public class Test { public static void main(String[] args) { //定义数组 int[] num={1,5,3,8,4,9}; //第一层循环 for(int i=0;i<num.length-1;i++) { boolean flag=true; //第二层循环 for(int j=0;j<num.length-1-i;j++) { //判断第一个数是否比第二个数大 if(num[j]>num[j+1]) { //如果是则交换 int temp=num[j]; num[j]=num[j+1]; num[j+1]=temp; =false; } } if(flag) { break; } } //输出 System.out.println("排序后的数组为:"); for(int i=0;i<num.length;i++) { System.out.println(num[i]); } } }
0条评论
点击登录参与评论