根据我前面写的递归思想(“学习递归算法-CSDN博客”),对常用的冒泡排序、插入排序、二分法查找分别实现代码如下:
package com.tfq.arithmetic.recursion;/*** @date: 2024/05/25/22:50* @description: 递归冒泡排序*/
public class BubbleSort {/*** 递归冒泡排序** @param a 待排序数组* @param j 代表未排序区域右边界* @return*/public static void recusionBubble(int[] a, int j) {if(j == 0) {return;}int x = 0;//左侧是无序的,右侧是有序的。for(int i = 0; i < j; i++) {int temp = 0;if(a[i] > a[i + 1]) {x = i;temp = a[i];a[i] = a[i + 1];a[i + 1] = temp;}}//递归从0到x结束recusionBubble(a, x);}
}
下面是递归插入排序
package com.tfq.arithmetic.recursion;/*** @date: 2024/05/27/8:30* @description: 递归插入排序*/
public class E05InsertionSort {public static void sort(int[] a) {insertion(a, 1);}/*** 递归插入排序,将low位置的元素插入至[0...low-1]的已排序区域** @param a 数组* @param low 未排序区域的左边界*/private static void insertion(int[] a, int low) {if(low == a.length) {return;}int t = a[low];int i = low - 1;//已排序区域的指针while(i >= 0 && a[i] > t) {//没有找到插入位置a[i + 1] = a[i];//空出插入位置i--;}//找到插入位置if(i + 1 != low) {a[i + 1] = t;}insertion(a, low + 1);//递归处理下一个元素}}
递归二分法查找
package com.tfq.arithmetic.recursion;/*** @date: 2024/05/24/16:12* @description: 递归二分查找*/
public class E03BinarySearch {public static int search(int[] a, int target) {return f(a, target, 0, a.length-1);}public static int f(int[] a, int target, int i, int j) {if(i > j) {return -1;}int m = (i + j) >>> 1;if(target < a[m]) {return f(a, target, i, m - 1);} else if(a[m] < target) {return f(a, target, m + 1, j);} else {return m;}}
}