当前位置 博文首页 > 程序员吴师兄的博客:这或许是东半球讲十大排序算法最好的一篇文

    程序员吴师兄的博客:这或许是东半球讲十大排序算法最好的一篇文

    作者:[db:作者] 时间:2021-06-13 15:43

    v2-3a97aecc91401cbfae0727e768ac68cd_b.jpg

    作者 | 不该相遇在秋天

    责编 | 程序员小吴

    ## 冒泡排序

    冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。


    v2-26cd0f04d2e4c6d7554ef5b92f6986c3_b.gif


    图解冒泡

    以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战:

    从左往右依次冒泡,将小的往右移动


    v2-8a547dd95024e03077716177a0b18213_b.jpg


    首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。

    指针往右移动一格,接着比较:


    v2-c71a96b7c17aef7b61d7b1b03e144e0d_b.jpg


    比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。

    指针再往右移动一格,继续比较:


    v2-92101a58e3259b1ccdeb00186a0f54aa_b.jpg


    比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ]

    同样,指针再往右移动,继续比较:


    v2-269b8f16a9120877986111e4b5c5ae46_b.jpg


    比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ]

    下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的 2 就是已经排好序的数字。

    通过这一轮不断的对比交换,数组中最小的数字移动到了最右边。

    接下来继续第二轮冒泡:


    v2-e8daf1acc6c1e1ff2543a6fa215a6a7c_b.jpg



    v2-8b3a26ca9d268afe6e6819bf246f79ca_b.jpg



    v2-44fdaaef5cc1c7b4bb3b30eeca6e7bce_b.jpg


    由于右边的 2 已经是排好序的数字,就不再参与比较,所以本轮冒泡结束,本轮冒泡最终冒到顶部的数字 5 也归于有序序列中,现在数组已经变化成了[ 8,9,7,5,2 ]。


    v2-aff8130eb5a32f7a4340d038194eb95e_b.jpg


    让我们开始第三轮冒泡吧!


    v2-b95ad72d538b9d9bbed862629c7f7bf7_b.jpg



    v2-471f722610e119d3a24b505c44432334_b.jpg


    由于 8 比 7 大,所以位置不变,此时第三轮冒泡也已经结束,第三轮冒泡的最后结果是[ 9,8,7,5,2 ]

    紧接着第四轮冒泡:


    v2-bef659d323343905bb7e9e5e9e3adca7_b.jpg


    9 和 8 比,位置不变,即确定了 8 进入有序序列,那么最后只剩下一个数字 9 ,放在末尾,自此排序结束。

    代码实现

            public static void sort(int arr[]){
        for( int i = 0 ; i < arr.length - 1 ; i++ ){
            for(int j = 0;j < arr.length - 1 - i ; j++){
                int temp = 0;
                if(arr[j] < arr[j + 1]){
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }