Java递归实现冒泡排序(黑马)

概述

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

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

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

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
在这里插入图片描述

案例 冒泡排序(普通版)

代码如下:

  //普通冒泡
    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);
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aholic 冲冲冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值