冒泡排序,相信大家听到这四个字都觉得很简单,我觉得也是,但能不能更简单呢?比如,用递归实现。
1、普通冒泡
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、递归冒泡
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 并等待新的循环传来的值,接收到最终循环传来的值终止自身调用并把结果返回给调用方。对比了二者,我认为递归冒泡在代码简洁性、可读性方面有优势。对于没有算法基础的朋友来说,刚接触到递归,可能会觉得有点绕,这是正常的。算法是一门很神奇的学问,它有难度、有意思,学会了往往这样的东西,能让你受益终生。