算法 - 冒泡排序

重点:依次对比邻近值,将较大/较小值向一侧移动

public class BubbleSort<T extends Comparable> {

    public void sort(T[] arr) {
        if (arr != null && arr.length > 1) {
            for (int i = 0; i < arr.length; i++) {
                int j = 0;
                for (; j < arr.length - 1 - i; j++) {
                    if (arr[j].compareTo(arr[j + 1]) > 0) {
                        T temp = arr[j + 1];
                        arr[j + 1] = arr[j];
                        arr[j] = temp;
                        for (T n : arr) {
                            System.out.print(n);
                        }
                        System.out.println();
                    }
                }
                System.out.println(String.format("第%d次交换,遍历了%d次", i + 1, j));
            }
        }
    }

    public static void main(String[] args) {
        Integer[] arr = new Integer[]{1, 3, 8, 7, 6, 9, 5, 4, 3, 2, 0};
        BubbleSort bs = new BubbleSort();
        bs.sort(arr);
    }

    /**
     * 13786954320 => 原数组,11个元素
     *    ^^       => 8比6大,交换
     * 13768954320
     *      ^^     => 9比5大,交换
     * 13768594320
     *       ^^    => 9比4大,交换
     * 13768549320
     *        ^^   => 9比3大,交换
     * 13768543920
     *         ^^  => 9比2大,交换
     * 13768543290
     *          ^^ => 9比0大,交换,后同
     * 13768543209
     * 第1次交换,遍历了10次
     * 13678543209
     * 13675843209
     * 13675483209
     * 13675438209
     * 13675432809
     * 13675432089
     * 第2次交换,遍历了9次
     * 13657432089
     * 13654732089
     * 13654372089
     * 13654327089
     * 13654320789
     * 第3次交换,遍历了8次
     * 13564320789
     * 13546320789
     * 13543620789
     * 13543260789
     * 13543206789
     * 第4次交换,遍历了7次
     * 13453206789
     * 13435206789
     * 13432506789
     * 13432056789
     * 第5次交换,遍历了6次
     * 13342056789 => 3从后方移动过来,原顺序未改变,因此稳定
     * 13324056789
     * 13320456789
     * 第6次交换,遍历了5次
     * 13230456789
     * 13203456789
     * 第7次交换,遍历了4次
     * 12303456789
     * 12033456789
     * 第8次交换,遍历了3次
     * 10233456789
     * 第9次交换,遍历了2次
     * 01233456789
     * 第10次交换,遍历了1次
     * 第11次交换,遍历了0次
     *
     * 最外层遍历了11次,最内层遍历了10 + 9 + ... + 1
     * => 遍历次数:n(n - 1)/2
     * => 时间复杂度:O(n2)
     * => 稳定性:稳定
     */

}

 

posted @ 2020-04-28 13:52  SamNicole1809  阅读(37)  评论(0编辑  收藏