二分查找
二分查找 :也称折半搜索,对数搜索,是用来在一个有序数组中查找某一元素的算法。
二分查找优缺点
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
使用二分查询有两种,一种是使用递归方式,另外一种是不使用递归(while循环)
Java代码实现
↓↓↓↓↓↓↓↓↓↓↓↓↓
/***
* 二分查找算法
*/
public class BinarySearch {
/**
* 1. 使用递归的二分查找
*title:recursionBinarySearch
*@param arr 有序数组
*@param key 待查找关键字
*@return 找到的位置
*/
public static int recursionBinarySearch(int[] arr,int key,int low,int high){
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
int middle = (low + high) / 2; //初始中间位置
if(arr[middle] > key){
//比关键字大则关键字在左区域
return recursionBinarySearch(arr, key, low, middle - 1);
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
return recursionBinarySearch(arr, key, middle + 1, high);
}else {
return middle;
}
}
/**
* 2. 不使用递归的二分查找
* @param arr
* @param key
* @return 关键字位置
*/
public static int commonBinarySearch(int[] arr,int key){
int low = 0;
int high = arr.length - 1;
int middle = 0; //定义middle
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
while(low <= high){
middle = (low + high) / 2;
if(arr[middle] > key){
//比关键字大则关键字在左区域
high = middle - 1;
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
low = middle + 1;
}else{
return middle;
}
}
return -1; //最后仍然没有找到,则返回-1
}
public static void main(String[] args) {
int[] arr = {3, 7, 8, 12, 22, 22, 33, 44, 58, 66, 77, 88, 97, 101};;
int key = 12;
//1.使用递归
//int position = recursionBinarySearch(arr,key,0,arr.length - 1);
//2.使用非递归
int position = commonBinarySearch(arr, key);
if(position == -1){
System.out.println("查找的是"+key+",序列中没有该数!");
}else{
System.out.println("查找的是"+key+",找到位置为:"+position);
}
}
}