概述

冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数(因为最后为最大的数,所以下一次循环会少循环一次)。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

用非递归的方式实现冒泡排序Python 递归实现冒泡排序算法_算法

案例 冒泡排序(普通版)

代码如下:

//普通冒泡
    public static void bubbleSort1(int[] a) {
        for (int i = 0; i < a.length - 1 ; i++) {
            for (int j = 0; j <a.length - 1 - i; j++) {
                if(a[j + 1] < a[j]) {
                   int temp = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = temp;
                }
            }
        }
    }

以最坏情况倒序的使用冒泡成正序来思考:

  • 5,4,3,2,1
    第一次循环将5排到了最后面,一共交换4次;
  • 4,3,2,1,5
    第二次循环将4归位,一共得交换3次;
  • 3,2,1,4,5
    第三次循环将3归位,一共得交换2次;
  • 2,1,3,4,5
    第四次循环将4归位,一共得交换1次;
  • 1,2,3,4,5,
    结束

分析:

  • 长上面可以看出5个数外层循环了4次(5 - 1);
  • 内层循环从4 ->1次依次递减(5 - 1 - 外层循环了的次数)这样再加上交换就可以得出以上算法;
  • 这里 i = 0 在公式中 i 首次等于 0 所以相当于 这里第一次的外层循环了的次数为0;

案例 冒泡排序(递归版)

代码:

public static void bubbleSort2(int[] a) {
            bubble(a, a.length - 1);
    }
  //sort递归部分(j 代表未排序区域的右边界)
    private static void bubble(int[] a, int j) {
        if (j == 0) return;
        for (int i = 0; i < j; i++) {
            if(a[i] > a[i + 1]) {
               int temp = a[i];
               a[i] = a[i + 1];
               a[i + 1] = temp;
            }
        }
        bubble(a, j - 1);
    }

与上面的普通版一毛一样,只是用的方法不同;

案例 冒泡排序(递归加强版)

加强在了新增了x记录每个递归函数交换后 i 的位置;
这样可以记录每个递归函数最后一次交换的位置,最后一次交换,则说明交换以后右边一定是有序的,无序的都在左边(包括x)所以下次循环直接以x为下次循环的边界则可以减少大部分多余的操作

举个例子:都是排序好的 1,2,3,4,5
那么默认x = 0因此直接退出(我只能说,妙)

public static void bubbleSort3(int[] a) {
        bubble2(a, a.length - 1);
    }
    //sort递归部分(j 代表未排序区域的右边界)
    private static void bubble2(int[] a, int j) {
        if (j == 0) return; //都没交换则j = 0 直接退出
        int x = 0;  // 在做用上是无序与有序的分界线(考虑没次循环的最后一次排序)
        for (int i = 0; i < j; i++) {
            if(a[i] > a[i + 1]) {
                int temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
                x = i;  //交换则把i赋值x(可以减少多余的递归)
            }
        }
        bubble(a, x);
    }