前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这种方式写冒泡,更简单

这种方式写冒泡,更简单

作者头像
JavaFish
发布2019-10-16 20:29:24
3570
发布2019-10-16 20:29:24
举报
文章被收录于专栏:狗哥的 Java 世界

【这是狗哥的第52篇文章】

接上一篇,来自我的好朋友,EvilSay 投稿的文章。以下是原文:

冒泡排序,相信大家听到这四个字都觉得很简单,我觉得也是,但能不能更简单呢?比如,用递归实现。

1、普通冒泡

代码语言:javascript
复制
public static int[] bubblerecursion (int array[]) {
    for (int i = 0;i < array.length - 1; i ++) {
        for (int j = i + 1;j < array.length;j ++) {
            if (array[j] < array[i]) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    return array;
}

普通的冒泡排序实现方式如上面代码所示,两个 for 循环 + 一个 if 判断。且不说代码量的问题,但就这可读性就把人给烦死。下面看看清新脱俗的递归冒泡是如何实现的。

2、递归冒泡

代码语言:javascript
复制
public int[] bubblerecursion(int[] nums){

  // step 1
  for (int i = 0; i < nums.length-1; i++) { 
    // step 2
    if(nums[i + 1] < nums[i] ){

      int tmp = nums[i+ 1];

      nums[i+ 1] = nums[i];

      nums[i] = tmp;
      // step 3
      return bubblerecursion(nums);
    }
  }
  // step 4
  return nums;
}
整段代码分为 4 部分,放入 Int 数组 nums = {1, 6, 2}
step 1

第一步为递归边界,当它完成循环后要么先向上一层循环返回值,要么终止整个自身调用并返回最终处理的值,当代码运行到第一步:i=0,i 要小于数组长度减 1,i++

step 2

把数组中第 i 位与第 i+1 位进行判断,如果为 true 则进行数组位置调换并进行到 step 3,如果为 false 则进入下一次 for 循环并在 for 循环结束后进入 step 4 。

注意:如果 step2 条件为 true 的话则不需要进入 step 4。

step 3

这是最绕的一步,代码调用自身形成递归。通过参数我们可以得知,如果代码执行到 step 3 那现在放入的参数变为 nums[1,2,6]。并在 step3 的时候开启一个新的循环。

注意:此时代码等于停在了 step3 并等待新的循环传来的值,接收到最终循环传来的值终止自身调用并把结果返回给调用方。

对比了二者,我认为递归冒泡在代码简洁性、可读性方面有优势。对于没有算法基础的朋友来说,刚接触到递归,可能会觉得有点绕,这是正常的。算法是一门很神奇的学问,它有难度、有意思,学会了往往这样的东西,能让你受益终生。

推荐阅读

java | 什么是动态代理?

SpringBoot | 是如何实现日志的?

SpringBoot | 是如何实现自动配置的?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个优秀的废人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档