常用排序算法专题—冒泡排序

冒泡排序

  冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

  • 基本思路

  我们假设有一个含有6个元素的int型的一维数组变量,他们分别是 2,7,8,9,6,4,我们对它们进行冒泡排序:

  我们首先对前6个元素进行第一轮排序:
对比第0个元素和第1个元素,即2和7,因为2<7,不进行操作;
对比第1个元素和第2个元素,即7和8,因为7<8,不进行操作;
对比第2个元素和第3个元素,即8和9,因为8<9,不进行操作;
对比第3个元素和第4个元素,即9和6,因为9>6,交换;
现在数组序列 2,7,8,6,9,4;
对比第4个元素和第5个元素,即9和4,因为9>4,交换;
现在数组序列 2,7,8,6,4,9;

  此时我们发现前6个数据的最大值‘9’已经“浮出”水面,我们下一步可以将前5个数据进行第二轮排序,让前5个数据的最大值“浮出”到倒数第二个位置。

  我们再对前5个元素进行第二轮排序:
对比第0个元素和第1个元素,即2和7,因为2<7,不进行操作;
对比第1个元素和第2个元素,即7和8,因为7<8,不进行操作;
对比第2个元素和第3个元素,即8和6,因为8>6,交换;
现在数组序列 2,7,6,8,4,9;
对比第3个元素和第4个元素,即8和4,因为8>4,交换;
现在数组序列 2,7,6,4,8,9; 停止

  此时我们发现前5个数据的最大值‘8’已经“浮出”到倒数第二个位置,我们下一步可以将前4个数据进行第三轮排序,让前4个数据的最大值“浮出”到倒数第三个位置。通过这种方法,以此类推,即可完成排序。

  • JAVA 代码如下:
package DataStructure;

public class BubbleSort {
    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++)
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
        }
    }

    public static void main(String[] args) {
        int[] arr = { 2, 7, 8, 9, 6, 4 };
        sort(arr);
        for (int n : arr)
            System.out.print(n + " ");
    }

}
  • 时间复杂度

  若文件的初始状态是正序的,一趟扫描即可完成排序(需要优化代码)。冒泡排序最好的时间复杂度为 O(n)。
  冒泡排序的最坏时间复杂度为 O(n²)。
  综上,因此冒泡排序总的平均时间复杂度为 O(n²)。

    原文作者:StevenMama
    原文地址: https://www.jianshu.com/p/2381634fd261
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞