冒泡排序-算法及优化

前言

喝汽水时,大家会发现一个个小气泡从瓶底慢慢浮到水面。这一情景形象地反映了冒泡排序的过程。冒泡排序(Bubble Sort)是一种简单的排序算法。通过依次比较相邻两个元素的大小,逆序则交换,使较大(或较小)元素经过不断的交换慢慢移动到数列的末端,最终使全部元素达到有序的状态。

实例

以数组 [3,5,4,2,1] 为例,希望实现从小到大排序,过程如下:

第一轮排序:

1.比较3和5的大小,因为3<5,符合小→大的顺序要求,因此不交换位置,数组仍为:[3,5,4,2,1] ;

2.比较5和4的大小,因为5>4,不符合小→大的顺序要求,因此交换位置,此时数组变为[3,4,5,2,1];

3.比较5和2的大小,5>2,交换,数组为[3,4,2,5,1];

4.比较5和1的大小,5>1,交换,数组为[3,4,2,1,5];

至此,数组的最大值已经“浮到”了数组末端。

第二轮排序:

1.比较3和4的大小,3<4,不交换,仍为[3,4,2,1,5];

2.比较4和2的大小,4>2,交换,数组为[3,2,4,1,5];

3.比较4和1的大小,4>1,交换,数组为[3,2,1,4,5];

4.比较4和5的大小,4<5,不交换,仍为[3,2,1,4,5];

至此,数组次大值也“浮到”了数组末端。

以此类推,再经过两轮排序后,就可以实现数组由小到大的排序。

原理

根据以上实例,不难总结出实现原理:

利用嵌套循环,内循环负责依次比较相邻数据的大小,顺序不对,则交换位置。外循环负责找到本轮数据中的最大值并置于最后。具体描述如下:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。结束后,最后的元素应该会是最大的数。

3.持续对越来越少的元素对重复上面的步骤,直到没有任何一对数字需要比较。

代码实现

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int [] arry = {3,5,4,2,1};
        for (int i = 0; i < arry.length-1; i++) {
            for (int j = 0; j < arry.length-1-i; j++) {
                if ( arry[j] > arry[j+1] ){
                    int temp = arry[j];                //若前面的元素>后面的元素则交换
                arry[j] = arry [j+1];
                arry[j+1] = temp ;
                }
            }
        }
        System.out.println(Arrays.toString(arry)); // 输出数组内容
}
}

优化

如果在某次排序中,没有发生任何交换,则表明元素的排列达到了有序,之后的判断便失去了意义,应该提前结束循环。代码如下:

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arry = {3, 5, 4, 2, 1};
        int count = 0;
        for (int i = 0; i < arry.length - 1; i++) {
            for (int j = 0; j < arry.length - 1; j++) {
                if (arry[j] > arry[j + 1]) {
                    count++;                           //只要出现元素交换,则count+1
                    int temp = arry[j];                //若前面的元素>后面的元素则交换
                    arry[j] = arry[j + 1];
                    arry[j + 1] = temp;
                }
            } if(count == 0){                           //若没有元素交换位置,则退出循环
                break;
            }else count = 0;                            //重置count,进行下一次判断

        }   System.out.println(Arrays.toString(arry)); // 输出数组内容
    }
}

声明

个人能力有限,不足之处,请多指正

文章为原创,欢迎转载,注明出处即可

谢谢观看,欢迎交流

posted @ 2021-04-28 21:50  Ji_Lei  阅读(123)  评论(0编辑  收藏  举报