算法·排序·冒泡排序

142 阅读2分钟

冒泡排序

1. 冒泡排序原理

冒泡排序的原理即通过每两个数之间的不断比较判定是否需要交换从而达到使得数字按照升序或者降序呈现。这句话之中的重点即为每两个数之间的不断比较判定是否需要交换

案例:[12, 5, 1]

  • 通过每两个数之间不断比较判定是否需要交换的流程
  1. 12是否小于5=>否=>二者进行交换=>[5, 12, 1]
  2. 12是否小于1=>否=>二者进行交换=>[5, 1, 12] (此时12为[5, 12 , 1]之中的最大数)
  3. 5是否小于1=>否=>二者进行交换=>[1, 5, 12] (此时5为[5, 1]之中的最大数)
  • 原理解释
  1. 不断将最小值/最大值通过交换移动到待排序数字的最左侧/最右侧

如:在[12, 5, 1]之中通过交换将12移动到[12, 5, 1]中的最右侧,即为[5, 1, 12]

  1. 缩小待排序数字的范围

如:在[12, 5, 1]之中,待排序数字的范围为[12, 5, 1],而经过一轮排序之后,我们得到[5, 1, 12],而我们已经确定12为[5, 1, 12]之中的最大值,因此下次只需将待排序数字的范围缩小至[5, 1]之中即可

2. 冒泡排序流程分析

  • 确定最小值/最大值所需要的比较次数 两个数确定最小值/最大值则两两之间只需比较1次,三个数确定最小值/最大值则两两之间只需比较3次,四个数确定最小值/最大值则两两之间只需比较6次,即可通过数学归纳法可得n个数确定最小值/最大值则两两之间只需比较n(n1)2n·\frac{(n-1)}{2}次,且n>1

  • 完成排序所需要的确定最小值/最大值所需要的比较次数

案例:[98, 94, 32, 56]

  1. 确定[98, 94, 32, 56]的最大值,则需要进行6次,结果为[94, 32, 56, 98]
  2. 确定[94, 32, 56]的最大值,则需要进行3次,结果为[32, 56, 94]
  3. 确定[32, 56]的最大值,则需要进行1次,结果为[32, 56]

即完成排序所需要的确定最小值/最大值所需要的比较次数为i=2nn(n1)2\sum_{i=2}^{n}n·\frac{(n-1)}{2}

3. Java代码实现(升序)

public class Solution {
  public void sort(int[] array) {
    for (int i = 0; i < array.length - 1; i++) {
      for (int j = 0; j < array.length - i - 1; j++) {
        if (array[j] > array[j + 1]) {
          int tempNum = array[j + 1];
          array[j + 1] = array[j];
          array[j] = tempNum;
        }
      }
    }
  }

  public static void main(String[] args) {
    int[] array = new int[]{12, 78, 941, 12, 1};
    Solution solution = new Solution();

    solution.sort(array);
    for (int item : array) {
      System.out.println(item);
    }
  }
}

4. 时间以及空间复杂度(平均)

  • 时间复杂度
O(N2)O(N^2)
  • 空间复杂度
O(1)O(1)

作者:通雄

版权声明:本文为原创文章,未经本人允许不得转载。