java实现折半查找(递归和非递归方式)
/** * 使用条件: * 1、折半查找必须采用顺序存储结果 * 2、关键字必须有序 */ public class TestBinarySearch { public static void main(String[] args) { //定义一个数组 int[] arr = {11,21,31,41,51,61,71,81,91}; System.out.println("非递归实现:"+binarySearch(arr,61)); System.out.println("递归实现:"+recursionSearch(arr,0,arr.length - 1,61)); } /** * 非递归实现 */ static int binarySearch(int[] arr,int key){ //定义开始值和结束值索引 int start = 0; int end = arr.length - 1; //查找前的判断 开始值索引大于结束值索引才进行查找 while (start <= end){ //定义中间索引 int mid = (start + end) / 2; //如果中间索引对应的元素值等于目标值,直接返回中间值索引 if (arr[mid] == key){ return mid; //中间值比目标值大,说明目标值在开始值和中间值之间 结束值索引变为mid-1 }else if (arr[mid] > key){ end = mid - 1; //反之,目标值在中间值和结束值之间,开始值索引变为mid+1 }else { start = mid + 1; } } //查找不到 返回-1 return -1; } /** * 递归实现 */ static int recursionSearch(int[] arr,int start,int end,int key){ //中间值索引 int mid = (start + end) / 2; //递归开始条件 while (start <= end){ //中间值等于目标值,直接返回中间值索引 if (arr[mid] == key){ return mid; }else if (arr[mid] > key){ //中间值大于目标值 结束值索引变为mid-1,继续递归查找 return recursionSearch(arr,start,mid - 1,key); }else{ //中间值小于目标值,开始值索引变为mid+1,继续递归查找 return recursionSearch(arr,mid + 1,end,key); } } //递归结束 未找到返回-1 return -1; } }
运行结果:
Develop good habits and use them to cover up bad habits.