根据我前面写的递归思想(“学习递归算法-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;
}
}
}