日拱一卒#冒泡排序#

100 阅读1分钟

认识冒泡排序

冒泡排序是最基础的排序算法,英文是 bubble sort,它是一种基础的交换排序。冒泡排序这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点地向着数组的一侧移动。

我们要把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻元素时,位置不变。


经过第一轮后:

元素 9 作为数列中最大的元素,就像是汽水里的小气泡一样,“漂”到了最右侧

每一轮结束都会有一个元素被移到最右侧

代码实现冒泡排序

public class BubbleSort {
    public static void main(String[] args) {
        int[] nums = new int[]{1,2,4,5,67,77,89,23,21,12};
        for (int i = 0; i < nums.length -1; i++) {
            for (int j = 0; j < nums.length -1-i; j++) {
                // 临时变量,用于交换位置
                int tmp =0;
                if(nums[j] > nums[j+1]){
                    tmp = nums[j];
                    // 交换位置
                    nums[j] = nums[j+1];
                    nums[j+1] = tmp;
                }
            }
        }
        for (int n: nums) {
            System.out.println(n);
        }
    }
}

代码优化

外层循环优化

在外层循环出、设置一个标识 isSort,默认为排好,如果不交换则跳出本次循环

内层循环优化

已经被移到右侧的元素不用再参与比较了(冒泡 是把大的移到最右边)

public class BubbleSort {
    public static void main(String[] args) {
        int[] nums = new int[]{5,6,7,2,7,88,9,33,232};
        for (int i = 0; i < nums.length -1; i++) {
            // 默认排序排好了
            boolean isSort = true;
            for (int j = 0; j < nums.length -1-i; j++) {
                // 临时变量,用于交换位置
                int tmp =0;
                if(nums[j] > nums[j+1]){
                    // 需要交换 则 isSort = false
                    isSort =false;
                    tmp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = tmp;
                }
            }
            // 排好了跳出循环
            if(isSort){
                break;
            }
        }

        for (int n: nums) {
            System.out.println(n);
        }
    }
}

时间复杂度:O(n*2)