二分法查询相关总结
说明:
二分查找又称折半查找,它是一种效率较高的查找方法。
折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。 折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。
优缺点:
折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
时间复杂度:
二分循环遍历数组时,
假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到二分到1结束(最坏情况),
那么我们设置次数为Y,则表达式:
N*(1/2)^Y=1;
经过推算:
可得 Y = Log2N (log以2为底的N)
代码实现:
一个递归实现,一个循环实现:
public class Test {
/**
* 二分查找算法
*
* @param array 有序数组
* @param key 查找元素
*/
public static void main(String[] args) {
int array[] = {2,3,5,7,11,13,19,23,29,31,32,55,66,70,81,95,110};
System.out.println("递归法:");
binSearch(array, 0, array.length - 1,81);
System.out.println("================================");
System.out.println("循环法:");
binSearch(array,5);
}
// 二分查找递归实现
public static void binSearch(int array[], int start, int end, int key) {
int mid = (end - start) / 2 + start;
if (array[mid] == key) {
System.out.println("key对应数组的索引位置:" + mid);
} else if (key > array[mid]) {
System.out.println("向右查找!");
if(mid+1 >= array.length) {
System.out.println("key在数组中不存在!");
}else {
binSearch(array, mid + 1, end, key);
}
} else if (key < array[mid]) {
System.out.println("向左查找!");
if(mid-1 < 0) {
System.out.println("key在数组中不存在!");
}else {
binSearch(array, start, mid - 1, key);
}
}
}
// 二分查找普通循环实现
public static void binSearch(int array[], int key) {
int mid = array.length / 2;
if (key == array[mid]) {
System.out.println("key对应数组的位置:" + mid);
}
int start = 0;
int end = array.length - 1;
while (start <= end) {
mid = (end - start) / 2 + start;
if (key < array[mid]) {
System.out.println("向左查找!");
end = mid - 1;
} else if (key > array[mid]) {
System.out.println("向右查找!");
start = mid + 1;
} else {
System.out.println("key对应数组的索引位置:" + mid);
break;
}
}
if(start > end){
System.out.println("key在数组中不存在!");
}
}
}