数据结构系列:图文详解冒泡排序 & 优化

时间:2022-07-28
本文章向大家介绍数据结构系列:图文详解冒泡排序 & 优化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

本文主要讲解排序算法中最简单的冒泡排序算法,希望你们会喜欢。


目录


1. 简介

属于 内排序算法中 的 交换排序类别


2. 算法思想

  1. 自下而上对 相邻的2个数依次 比较 & 调整
  2. 若 反序 则交换,直到 无反序的记录 为止。

较大的数往下沉,较小的数类似气泡一样往上冒,故称:冒泡排序


3. 算法示意图

整个过程就跟冒泡一样,最小值一直往上“冒泡”,具体如下:

a. 2与6对比:因2<6,所以交换位置

b. 2与4对比:因2<4,所以交换位置

c. 2与7对比:因2<7,所以交换位置

以此类推,最终将序列中最小值放到了首位(冒上来了)


4. 算法实现

4.1 具体代码

具体请看注释

public class BubbleSort {

    /**
     * 基本的 冒泡排序
     */
    public static void bubbleSort(int[] srcArray) {
        int i,j; // 用于存放数组下标
        int temp = 0; // 用于交换数值时临时存放值

        for(i=0;i<srcArray.length-1;i++){
            // j 从后往前循环
            for(j=srcArray.length-2;j>=i;j--){
                // 若前者>后者,则交换位置
                if(srcArray[j]>srcArray[j+1]){
                    temp=srcArray[j];
                    srcArray[j]=srcArray[j+1];
                    srcArray[j+1]=temp;
                }
            }
        }

        // 输出排序后的序列
        for(int a =0;a<srcArray.length;a++)
            System.out.println(srcArray[a]);
    }

    /**
     * 执行 冒泡排序
     */
    public static void main(String[] args) {

        // 定义待排序数列
        int[] src = new int[]{9, 1, 5, 8, 3, 7, 4, 2, 6};
        // 输出结果
        bubbleSort(src);
    }
}

4.2 算法示意图

  1. 当 i =0时,算法示意图如下:
  1. 当 i =1时,算法示意图如下:
  1. i = 2、3、4依次类推…

4.3 最终测试结果

1
2
3
4
5
6
7
8
9

5. 算法优化

  • 简介
  • 具体实现
public class BubbleSort {
    /**
     * 优化的 冒泡排序
     */
    public static void bubbleSortOpti(int[] srcArray) {

        int i,j; // 用于存放数组下标
        int temp = 0; // 用于交换数值时临时存放值

        // 标记位
        // flag = true:代表存在数据交换,即序列仍需排序,需继续循环
        // flag = false:代表不存在数据交换,即序列不需排序,已经是有序序列了,可停止循环
        Boolean flag = true;
        // 若flag = false时退出循环
        for(i=0;i<srcArray.length-1 && flag;i++){

            flag = false; // 初始化为false

            // j 从后往前循环
            for(j=srcArray.length-2;j>=i;j--){
                // 若前者>后者,则交换位置
                if(srcArray[j]>srcArray[j+1]){
                    temp=srcArray[j];
                    srcArray[j]=srcArray[j+1];
                    srcArray[j+1]=temp;
                    flag = true; // 若有数据交换,则说明序列仍未无序
                }
            }
        }

        // 输出排序后的序列
        for(int a =0;a<srcArray.length;a++)
            System.out.println(srcArray[a]);
    }

    /**
     * 执行 优化后的冒泡排序
     */
    public static void main(String[] args) {
        // 定义待排序数列
        int[] src = new int[]{2, 1, 3, 4, 5, 6, 7, 8, 9};
        // 输出结果
        bubbleSortOpti(src);
    }
}

6. 性能分析

以下将分析算法的性能:时间复杂度、空间复杂度、稳定性


7. 总结

  • 本文主要讲解了 排序算法中 的冒泡排序
  • 下面我将继续讲解 数据结构,有兴趣可以继续关注Carson_Ho的安卓开发笔记