1. 解决实际问题
这就是一个查找问题,这个时候就可以使用二分查找算法。
2. 实现原理
二分查找是一种算法,其是对一个有序的元素列表进行查找(查找对象必须有序)。
3. 代码实现步骤
- 首先要确定该数组的中间下标(左右下标是动态变化的)
mid=(left+right)/2 - 然后让需要查找的数findVal和arr[mid]比较
a) findVal>arr[mid] ,说明要查找的数在mid的右边,需要递归向右查找
b) findVal<arr[mid],说明要查找的数在mid的左边,需要向左边递归查找
c) findVal=arr[mid]说明找到,就返回相应的数组下标 - 什么时候递归结束(出口)
a) 找到结果就递归结束
b) 递归完整个数组,任然没有找到findVal,也需要结束递归,当left>right的时候就说明检索完数组都没找到。
4. java代码实现
public class BinarySearch {
public static void main(String[] args) {
//注意使用二分查找的前提是,该数组是有序的
int arr[]={1,8,10,89,1000,1234};
int resIndex=binarySearch(arr,0,arr.length-1,89);
System.out.println("resIndex:"+resIndex);
}
//二分查找
/**
*
*
* @param arr 需要进行查找的数组
* @param left 查找范围的最左边索引值,动态变化,初始值是0
* @param right 查找范围的最后边索引值,动态变化,初始值是数组的最大索引值
* @param findVal 需要查找的值
* @return
*/
public static int binarySearch(int[] arr,int left,int right,int findVal){
//当left>right的时候,说明递归结束,但是没有找到
if(left>right){
return -1;
}
int mid=(left+right)/2;
int midVal=arr[mid];
if (findVal>midVal){
return binarySearch(arr,mid+1,right,findVal);
}else if(findVal<midVal){
return binarySearch(arr,left,mid-1,findVal);
}else{
return mid;
}
}
}
5. C++代码实现
#include <iostream>
int binarySearch(int arr[],int left,int right,int findVal) {
//出口
//当left<right的时候,说明递归结束,没有找到返回-1
if(left>right)
{
return -1;
}
//int mid = (left + right) / 2;
int mid = left + (right - left) / 2;//防止数据过大,越界
int midVal = arr[mid];
//当需要查找值大于中值时候,需要向右递归
if (findVal>midVal) {
return binarySearch(arr, mid + 1, right,findVal);
}else if(findVal<midVal)
{
//当需要查找值小于中指的时候,须有向左递归
return binarySearch(arr, left, mid - 1, findVal);
}else
{
return mid;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//查找范围的最左边索引和最右边索引是动态变化的
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
std::cout << binarySearch(arr,left,right,0) << std::endl;
}