冒泡排序算法(JAVA)

Posted JAVA首席架构师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序算法(JAVA)相关的知识,希望对你有一定的参考价值。

微信公众号:Java野生程序猿
如有问题或建议,请公众号留言

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。


这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。


原理:比较两个相邻的元素,将值大的元素交换至右端。


依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。

  • 第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。

  • 比较第2和第3个数,将小数 放在前面,大数放在后面。

  • 如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成

  • 在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。

  • 在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。

  • 依次类推,每一趟比较次数减少依次




举例说明:要排序数组:int[] arr={6,3,8,2,9,1};   


第一趟排序:


    第一次:6和3比较,6大于3,交换位置:  3  6  8  2  9  1


    第二次:6和8比较,6小于8,不交换位置:3  6  8  2  9  1


    第三次:8和2比较,8大于2,交换位置:  3  6  2  8  9  1


    第四次:8和9比较,8小于9,不交换位置:3  6  2  8  9  1


    第五次:9和1比较:9大于1,交换位置:  3  6  2  8  1  9


    第一趟总共进行了5次比较, 结果为:      3  6  2  8  1  9




第二趟排序:  

             第一次:3和6比较,3小于6,不交换位置:3  6  2  8  1  9


    第二次:6和2比较,6大于2,交换位置:  3  2  6  8  1  9


    第三次:6和8比较,6大于8,不交换位置:3  2  6  8  1  9


    第四次:8和1比较,8大于1,交换位置:  3  2  6  1  8  9


    第二趟总共进行了4次比较, 结果为:      3  2  6  1  8  9




第三趟排序:

  

          第一次:3和2比较,3大于2,交换位置:  2  3  6  1  8  9


    第二次:3和6比较,3小于6,不交换位置:2  3  6  1  8  9


    第三次:6和1比较,6大于1,交换位置:  2  3  1  6  8  9


    第三趟总共进行了3次比较, 结果为:         2  3  1  6  8  9





第四趟排序:


    第一次:2和3比较,2小于3,不交换位置:2  3  1  6  8  9


    第二次:3和1比较,3大于1,交换位置:  2  1  3  6  8  9


    第四趟总共进行了2次比较, 结果为:        2  1  3  6  8  9




第五趟排序:

  

          第一次:2和1比较,2大于1,交换位置:  1  2  3  6  8  9


    第五趟总共进行了1次比较, 结果为:  1  2  3  6  8  9




最终结果:1  2  3  6  8  9




冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。


时间复杂度



冒泡排序总的平均时间复杂度为:O(n2) 


代码实现:


import java.util.Arrays;

public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = {46233532056};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr) {
        //记录最后一次交换的位置
        int lastExchangeIndex = 0;
        //无序数列的边界,每次比较只需要比到这里为止
        int sortBorder = arr.length - 1;
        for (int i = 0; i < arr.length; i++) {
            boolean isSorted = true;
            //无序数列的边界,每次比较只需要比到这里为止
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                    //有元素交换,所以不是有序,标记变为false
                    isSorted = false;
                    //把无序数列的边界更新为最后一次交换元素的位置
                    lastExchangeIndex = j;
                }
            }
            if (isSorted) {
                break;
            }

        }
    }

}



如果您喜欢,分享一下让更多的人学习

请点击标题下方的“Java野生程序猿”添加关注

或者长按下方的二维码添加关注


以上是关于冒泡排序算法(JAVA)的主要内容,如果未能解决你的问题,请参考以下文章

java冒泡排序法代码

冒泡排序java

冒泡排序

Java排序算法之冒泡排序

Java常见算法——冒泡排序选择排序

java排序算法:冒泡排序