二分查找

二分查找的概念

在计算机科学,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法,搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半

应用二分查找的条件

数据应该
- 存储在数组中
- 有序排列

问题1:为什么要存储在数组中?
问题2:为什么要有序排列?

二分查找的算法的实现

import java.util.Arrays;

public class BinarySearch {
    public static void main(String[] args) {
        int a[]={1,7,3,8,9,12,6,15,17};
        Arrays.sort(a);
        for (int b : a) {
            System.out.print(b+" ");
        }
        System.out.println();
        System.out.println(search(15,a));
    }
    public static int search(int key,int[] a){
        int lo = 0;
        int hi = a.length - 1;
        while (lo <= hi) {
            // Key is in a[lo..hi] or not present.
            int mid = lo + (hi - lo) / 2;
            if(key < a[mid]){
                hi = mid - 1;
            }
            else if (key > a[mid]) {
                lo = mid + 1;
            }
            else return mid;
        }
        return -1;
    }
}

问题1:可以在链表上实现,但是链表的随机访问效率很低,所以需要数组。
问题2:有序可以使每次比较后范围缩小一半,查找速度快

二分查找过程描述

查找的数为15,把数组排序后:
1 3 6 7 8 9 12 15 17

第1次:lo=0,hi=8,mid=4,a[mid]=8
第2次:lo=5,hi=8,mid=4,a[mid]=12
第3次:返回mid

3次可以把数找出来

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章