java算法-二分查找算法

时光怂恿深爱的人放手 提交于 2020-01-24 04:22:33

一、二分查找算法思想

又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
 
二、图示说明
 

三、二分查找优缺点

优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用条件:查找序列是顺序结构,有序。

四、代码实现

1.非递归方法

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

2.递归方法

 public static int binarySearch(int[] arr,int left,int right,int key){
        if (key < arr[left] || key > arr[right] || left > right){
            return -1;
        }
        int mid = (left+right)/2;
        if (arr[mid]<key){
           return binarySearch(arr,mid+1,right,key);
        }else if(arr[mid]>key){
           return binarySearch(arr,left,mid-1,key);
        }else {
            return mid;
        }
    }

五、时间复杂度和空间复杂度

时间复杂度
采用的是分治策略

最坏的情况下两种方式时间复杂度一样:O(log2 N)

最好情况下为O(1)

空间复杂度
  算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数

非递归方式:由于辅助空间是常数级别的,所以空间复杂度是O(1);

递归方式: 递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:
 空间复杂度:O(log2N )
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!