查找算法专辑(二分查找)未完待续....
一、二分查找
原理:
首先,使用二分法查找的前提是:被查找的数组已排好序
具体实现:
假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.
- 1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。
- 2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>a[mid],故确定应在后半段中查找。
- 3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功,返回查找元素的索引。
如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功,放回-1。
再如下面的,我们查找24这个数的位置:
时间复杂度:
时间复杂度
- 1.最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(logn)
- 2.最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)
空间复杂度:S(n)=n
代码实现:
public class BinarySearchDemo {
public static void main(String[] args) {
int[] data = {3, 26, 50, 10, 81, 91, 7, 121, 100, 40, 81};
// 二分法基于有序数据
Arrays.sort(data);
System.out.println(Arrays.toString(data));
System.out.println("50 的索引:"+binarySearch(data,50));
System.out.println("16 的索引:"+binarySearch(data, 16));
}
public static int binarySearch(int[] data, int value) {
int low = 0;
int high = data.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (value == data[mid]) {
return mid;
}
if (value > data[mid]) {
low = mid + 1;
}
if (value < data[mid]) {
high = mid - 1;
}
}
return -1;
}
}
[3, 7, 10, 26, 40, 50, 81, 81, 91, 100, 121]
50 的索引:5
16 的索引:-1