查找算法----二分查找

二分查找

也称为折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线性表分成两个子表,若相等则查找成功,若不相等,在根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或者找结束发现表中没有这样的点。
元素必须是有序的,如果是无序的则要先进行排序操作。
时间复杂度为O(loig2n)
折半查找的前提是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,因此不建议使用。
迭代法
在这里插入图片描述
递归法
在这里插入图片描述

package 查找算法;
//二分查找
public class BinarySearch {
    public static void main(String[] args) {
        int arr[]={1,2,3,4,5,6,7,8,9};
        int key=8;
        //迭代法
        int index=binarySearch(arr,key);
        System.out.println("index="+index);

        //递归法
        int index1=binarySearch(arr,key,0,arr.length-1);
        System.out.println("index="+index1);

    }

    private static int binarySearch(int[] arr, int key, int low, int high) {
        if(low>high){
            return -1;
        }
        int mid=(low+high)/2;
        if(arr[mid]==key){
            return mid;
        }else if (key<arr[mid]){
            return binarySearch(arr,key,low,mid-1);
        }else {
            return binarySearch(arr,key,mid+1,high);
        }
    }

    private static int binarySearch(int[] arr, int key) {
        int low=0;
        int high=arr.length-1;
        int mid=(low+high)/2;
        while (arr[mid]!=key){
            if(arr[mid]>key){
                high=mid-1;
            }else if (arr[mid]<key){
                low=mid+1;
            }
            if (low>high){
                return -1;
            }
            mid=(low+high)/2;
        }
         return mid;
    }
}

执行结果

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