1.掌握递归方法的使用
2.掌握二分法原理
本文章主要为记录以前的学习内容,通过二分法算法来回顾一下递归方法的使用。
首先来介绍一下二分法和递归的概念:
1)二分法:即一分为二的方法,在有序的区间列表中,通过区间中间数据与查询数据的对比,判断查询数据是在该区间数据中的上半部分还是下半部分,继而缩小对比范围依次类推,查询出查询数据的具体位置的算法。
2)递归:程序调用自身的编程技巧
言归正传,知道了概念之后,那么就直接上代码来看看二分法具体的实现:
/**
* 二分法优缺点
* 优点:比较次数少,查询速度快,平均性能好
* 缺点:要求待查表示有序表,插入删除困难
*/
public class Dichotomy {
public static void main(String[] args) {
//有序数组
int arr[] = {1,3,5,7,9,12,15,22,31,42,55};
//待比较数字
int number = 50;
int result = dichotomy(number,arr,0,arr.length);
if(result<=0){
//小于等于0说明最小
System.out.println("输入数据为最小数据,排在" + arr[0] + "之前!");
} else if (result >= arr.length){
//大于等于最大数组长度说明最大
System.out.println("输入数据为最大数据,排在" + arr[arr.length-1] + "之后!");
} else {
//在区间内
System.out.println("比较的数据在"+ arr[result-1] + "和" + arr[result] + "中间!");
}
}
private static int dichotomy(int number, int[] arr ,int begin , int end) {
//记录number在有序数组中的位置
int count;
int middle = (begin + end)/2;
//输入数字大于等于最大的
if(number>=arr[end-1]){
count = end;
return count;
}
//输入数字小于等于最小的
if(number<=arr[begin]){
count = begin-1;
return count;
}
//当输入的开始+1等于结束时,说明数据在开始和结束之间
if(end==(begin+1)){
count = begin+1;
return count;
}
//递归调用,二分法的精髓
if(number>arr[middle]){
return dichotomy(number,arr,middle,end);
} else if(number<arr[middle]){
return dichotomy(number,arr,begin,middle);
} else {
count = middle+1;
return count;
}
}
}
代码出来了,结果是怎样的呢,这里咱们来测试几个数据,为了方便测试呢,这里咱们吧输入的数据做换成从数组中获取,如下:
int number[] = {0,1,9,13,55,56};
for(int i=0;i<number.length;i++){
int result = dichotomy(number[i],arr,0,arr.length);
if(result<=0){
//小于等于0说明最小
System.out.println("输入数据:"+ number[i] +"为最小数据,排在" + arr[0] + "之前!");
} else if (result >= arr.length){
//大于等于最大数组长度说明最大
System.out.println("输入数据:"+ number[i] +"为最大数据,排在" + arr[arr.length-1] + "之后!");
} else {
//在区间内
System.out.println("比较的数据:"+ number[i] +"在"+ arr[result-1] + "和" + arr[result] + "中间!");
}
}
这个时候就可以直接运行看结果了,效果如下: