package com.myway.study;
/**
* 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
* 1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
* 2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
* 二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较
* User: zhangyong
* Date: 14-5-14
* Time: 下午10:06
* To change this template use File | Settings | File Templates.
* 二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k,其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O()=O(logn)
*/
public class BinarySearch {
public int sort(int[] arr, int searchNum) {
int length = arr.length;
int low = 0;
int high = length - 1;
while (low <= high) {
int middle = (low + high) / 2;
int middleValue = arr[middle];
if (middleValue == searchNum) {
return middle;
} else if (middleValue > searchNum) {
high = middle;
} else {
low = middle;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 5, 6, 7, 8};
System.out.println(new BinarySearch().sort(arr, 7));
}
}
二分查找法
最新推荐文章于 2022-02-07 14:26:03 发布