图文并茂!一文教你掌握十大排序算法之冒泡排序及其优化思路

目录

1.冒泡排序介绍

2. O(n^2)的实现方法

3. 优化思路1:提前到达有序

4. 优化思路2:获取交换的最后一个元素下标

5. 总结


1.冒泡排序介绍

冒泡排序是一种比较简单的排序方法,以数组升序的情况为例,它的原理是从第一个元素开始,每个元素都与其相邻的元素做比较,如果前一个元素比后一个元素大,则交换两个元素的位置,每一轮排序都确定一个最大值。它是一种稳定的排序方法,因为两个元素相等时不会做交换,相对位置不会发生改变。

2. O(n^2)的实现方法

/**
 * @author Zeng
 * @date 2020/2/27 16:39
 */
public class BubbleSort1 {

    public static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

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

    public static void main(String[] args) {
        int[] arr = new int[]{5, 3, 1, 6, 2, 4};
        bubbleSort(arr);
        for (int i : arr) {
            System.out.print(i+ " ");
        }
    }

}
//第1趟排序结果:3 1 5 2 4 6 
//第2趟排序结果:1 3 2 4 5 6 
//第3趟排序结果:1 2 3 4 5 6 
//第4趟排序结果:1 2 3 4 5 6 
//第5趟排序结果:1 2 3 4 5 6 
//第6趟排序结果:1 2 3 4 5 6 

3. 优化思路1:提前到达有序

如果数组本来就有序,那么使用上面的代码依旧会对数组进行6轮排序,但是一个元素都没有交换,所以我们为数组添加一个标志tag,如果某一轮排序中没有数组元素进行交换,那么就代表此时的数组已经有序,无需进行下一轮的排序。

/**
 * @author Zeng
 * @date 2020/2/27 16:39
 */
public class BubbleSort2  {

    public static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void bubbleSort(int[] arr){
        //判断某一轮排序有没有进行元素交换,如果为false则代表数组已有序
        boolean flag;
        for (int i = 0; i < arr.length; i++){
            flag = false;
            for (int j = 0; j < arr.length  - i - 1; j++){
                if(arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                    flag = true;
                }
            }
            if(!flag){
                return ;
            }
            System.out.print("第"+(i+1)+"趟排序结果:");
            for (int k : arr) {
                System.out.print(k+" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 6, 5};
        bubbleSort(arr);
    }

}
//第1趟排序结果:1 2 3 4 5 6 

4. 优化思路2:获取交换的最后一个元素下标

在某一趟排序中有可能在某个元素之后都没有做交换操作,那么可以知道该元素以后已经有序,下一轮排序不需要对该元素以后的其它元素做排序,所以我们可以用一个变量pos进行记录当前一轮排序中交换元素的最后一个位置,每一轮排序只针对第1个元素到第pos个元素进行,第pos+1个元素开始已经保持有序,同样我们采用优化思路1,如果某一趟排序没有元素做交换,那么证明数组已经有序,不需要进行下一轮的排序。

扫描二维码关注公众号,回复: 9595335 查看本文章

/**
 * @author Zeng
 * @date 2020/2/28 8:28
 */
public class BubbleSort3 {

    public static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void bubbleSort(int[] arr){
        int position = arr.length - 1;
        int tmpPosition = position;
        boolean flag;
        for (int i = 0; i < arr.length; i++){
            flag = false;
            for (int j = 0; j < tmpPosition; j++){
                if(arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                    position = j;
                    flag = true;
                }
            }
            if(!flag){
                return ;
            }
            System.out.print("第"+(i+1)+"趟排序结果:");
            for (int k : arr) {
                System.out.print(k+" ");
            }
            System.out.println("最后交换元素的位置pos:"+position);
            tmpPosition = position;
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[]{3,2,1,5,4,6};
        bubbleSort(arr);
    }

}
//第1趟排序结果:2 1 3 4 5 6 最后交换元素的位置pos:3
//第2趟排序结果:1 2 3 4 5 6 最后交换元素的位置pos:0

5. 总结

冒泡排序是九大排序算法中较为简单的排序算法,但是也要考虑其优化,目前我只能想到这两种优化方法,如果大家有其它优化思路可以分享给我,如果代码有什么错误欢迎指出,能力有限,时间有限,乐意与大家交流!

发布了50 篇原创文章 · 获赞 46 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41949328/article/details/104563838