常用十种算法
1 二分查找算法(非递归)
对于数组{1,3,8,10,11,67,100},使用非递归的方式完成二分查找。
实现思路:递归方式的实现思路通过传入本轮查找的起始位置和终止位置作为参数,实现不断的分段递归。非递归方式则无需传参,只需要在循环中不断改变查找的左右位置即可。
完整代码实现(递归+非递归):
/**
* 非递归二分查找
*/
public class BinarySearch {
public static void main(String args[]){
int[] arr = {1,3,8,10,11,67,100};
int index = binarySearch(arr, -8);
System.out.println("index="+index);
}
/**
* 非递归的二分查找
* @param arr 待查找的数组
* @param target 待查找的值
* @return
*/
public static int binarySearch(int[] arr,int target){
int left = 0;
int right = arr.length;
while(left<=right){
int mid = (left+right)/2;
if(arr[mid] == target){
return mid;
}else if(arr[mid] > target){
right = mid -1;
}else{
left = mid +1;
}
}
return -1;
}
/**
* 递归方式实现二分查找
* @param arr 数组
* @param left 左边的索引
* @param right 右边的索引
* @param fingValue 需要查找的值
* @return 如果找到就返回下标,如果没有找到就返回-1
*/
public static int binarySearch(int[] arr,int left,int right,int fingValue){
//递归结束条件2:递归完整个数组,仍然没有找到findValue
if(left > right) return -1;
//1.首先确定该数组的中间的下标
int mid = (left + right)/2;
//2.让需要查找的数findValue和arr[mid]进行比较
//2.1 向右递归
if(arr[mid] < fingValue) return binarySearch(arr, mid + 1, right, fingValue);
//2.2 向左递归
else if(arr[mid] > fingValue) return binarySearch(arr, left, mid - 1, fingValue);
//递归结束条件1:找到相应的值
else return mid;
}
}