冒泡排序的学习

106 阅读3分钟

冒泡排序(Bubble Sort)

​ 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

算法描述
  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
例子
数组: 3  5  15  26  27  2  28  4
第一次: 3  5  15  26  2  27  4  28
第二次: 3  5  15  2  26  4  27  28
第三次: 3  5  2  15  4  26  27  28
第四次: 3  2  5  4  15  26  27  28
第五次: 2  3  4  5  15  26  27  28
结束
算法复杂度

空间复杂度: O(1)

时间复杂度:O(n²) 最坏结果

​ O(n²) 平均结果

​ O(n) 最好结果

排序稳定,原来相等的两个参数排在前面的依旧是排在前面。

代码实现
public static void bubbleSort(int[] arr){
        int len = arr.length;
        int temp;
        for (int i = 0; i<len-1;i++){
            for (int j=0; j<len-1;j++){
                if (arr[j] > arr[j+1]) {        // 相邻元素两两对比
                    temp = arr[j+1];        // 元素交
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
            System.out.println(Arrays.toString(arr));
        }
}

运行结果

输入数组:int[] arr = {3,5,15,26,27,2,28,4};
[3, 5, 15, 26, 2, 27, 4, 28]
[3, 5, 15, 2, 26, 4, 27, 28]
[3, 5, 2, 15, 4, 26, 27, 28]
[3, 2, 5, 4, 15, 26, 27, 28]
[2, 3, 4, 5, 15, 26, 27, 28]
[2, 3, 4, 5, 15, 26, 27, 28]
[2, 3, 4, 5, 15, 26, 27, 28]

但是按照上面的步骤,这时候我们可以看到和演算结果一致,但是出现了一个问题就是演算的次数对不上,在结果已经出现后依旧进行排序,这里我们可以进行有画加上一个条件判断:

  public static void bubbleSort(int[] arr){
        boolean isUpdate = true; //是否修改
        int len = arr.length;
        int temp;
        for (int i = 0; i<len-1;i++){
            for (int j=0; j<len-1;j++){
                if (arr[j] > arr[j+1]) {        // 相邻元素两两对比
                    temp = arr[j+1];        // 元素交
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                    isUpdate = false;
                }
            }
            if(isUpdate){
                break;
            }
            isUpdate = true;
            System.out.println(Arrays.toString(arr));
        }
    }

运行结果

输入数组:int[] arr = {3,5,15,26,27,2,28,4};
[3, 5, 15, 26, 2, 27, 4, 28]
[3, 5, 15, 2, 26, 4, 27, 28]
[3, 5, 2, 15, 4, 26, 27, 28]
[3, 2, 5, 4, 15, 26, 27, 28]
[2, 3, 4, 5, 15, 26, 27, 28]

这样运行的结果就和我们演算的一样。