前言:
????二分查找又稱折半查找,是一種效率較高的查找方法。前提條件:列表為有序 , 時(shí)間復(fù)雜度:o(logn)。
算法原理:
<1>首先確定為查找區(qū)間的中間位置mid = (end - start) / 2 + start;
<2>比較中間位置與目標(biāo)元素的值:
??1)若相等,則查找成功,返回結(jié)束;
??2)若中間位置元素大于目標(biāo)值,則在中間位置左半部分查找;
??3)若中間位置元素小于目標(biāo)值,則在中間位置右半部分查找;
<3>重復(fù)上述步驟。
算法實(shí)現(xiàn):
/**
* @author lm
* @create 2018-10-13 13:11
* @desc 折半查找算法
**/
public class BinarySearch {
/**
* 折半查找算法
*
* @param arr 有序數(shù)組
* @param start 數(shù)組起始 查找位置
* @param end 數(shù)組結(jié)束查找位置
* @param target 目標(biāo)元素
* @return -1:查找失敗 非-1: 元素所在位置
*/
public static int binarySearch(int[] arr, int start, int end, int target) {
if (start >= end) {
return -1;
}
int mid = (end - start) / 2 + start;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] > target) {
end = mid - 1;
return binarySearch(arr, start, end, target);
} else {
start = mid + 1;
return binarySearch(arr, start, end, target);
}
}
//測(cè)試用例
public static void main(String[] args) {
int[] arr = {0,1,2,3,4,5,6,7,8,9,10};
int res = binarySearch(arr,0, arr.length, 5);
System.out.println(res);
}
}
算法分析:
<1>由于每次折半查找,因此查找次數(shù)比較少,查找速度相對(duì)較快,平均性能比較好;
<2>由于要求帶查找列表為有序,因此該算法適用于元素不經(jīng)常變動(dòng)而查找頻繁的場(chǎng)景。