Java算法之二分查找算法
二分查找算法概述
折半查找又叫二分法查找,在一个查找区间中,确定出查找区间的中心位置,用待查找数据元素的关键字与中心位置上的数据元素的关键字比较,若两者相等,则查找成功;否则,若前者小于后者,则把查找区间定为原查找区间的前半段继续这样的过程;否则,则把查找区间的后半段继续这样的过程。
二分查找算法思想
二分查找算法是建立在有序数组基础上的。算法思想为:
1. 查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则查找过程结束;
2. 如果某一待查找元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟第1点一样从中间元素开始继续进行查找。
3. 如果在某一步骤数组为空,则代表找不到。
二分查找算法原理
采用二分法查找时,数据需是排好序的。基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
二分查找算法源码
二分查找有while循环和递归查找两种,源码使用循环查找数组中数据。
package com.algorithm;
/**
* 二分查找
* @author Administrator
*
*/
public class BinarySearch {
public static int binarySearch(int[] dataset ,int data) {
int beginIndex = 0; //定义起始位置
int endIndex = dataset.length - 1; //定义结束位置,数组下标
int midIndex = -1; //定义中点
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
return -1; //用二分法查找的数据必须是排好序的,因此只要比较第一个元素和最后一个元素就可以确定所查找的数据是否在数组中
}
while(beginIndex <= endIndex) {
midIndex = (beginIndex+endIndex)/2;//初始化中点
if(data <dataset[midIndex]) {
endIndex = midIndex-1; //如果查找的数据小于中点位置的数据,则把查找的结束位置定义在中点
} else if(data>dataset[midIndex]) { //如果查找的数据小于中点位置的数据,则把查找的起始位置定义在中点
beginIndex = midIndex+1;
}else {
return midIndex; //返回查找到的数据的位置
}
}
return -1;
}
public static void main(String[] args) {
int[] test1 = { 38,48,59,61,72,99,101 }; // 测试数组
System.out.print("你查找的数据在数组中下标是:"+ BinarySearch.binarySearch(test1,59));
}
}
算法效果:
你查找的数据在数组中下标是:2
总结
二分查找法的时间复杂度为O(log n),比较简单。也是面试中常考的一个知识点。
推荐博客:
二分查找各种情况大总结 :二分查找算法不同场景的整理、
二分查找专题:面试中常见的二分查找算法整理。