22、数据结构和算法 - 实战:二分查找算法

1.1 线性查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。 但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

1.2 二分查找代码实现

package com.yuanxw.datastructure.chapter22;

import java.util.Arrays;

/**
 * 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
 * 但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
 */
public class BinarySearch {
   
     
    public static void main(String[] args) {
   
     
        int[] array = new int[]{
   
     -7, -4, -2, 5, 8, 10};
        System.out.println("原始数据:" + Arrays.toString(array));
        int index = binarySearch(array,0,array.length-1,5);
        System.out.println("【二分查找】结果下标位置:" + index);
        index = binarySearch(array,10);
        System.out.println("【二分查找】非递归方式查找结果下标位置:" + index);
    }

    /**
     * 兩分查找方法
     *
     * @param array
     * @param value
     */
    public static int binarySearch(int[] array, int left, int right, int value) {
   
     
        // 当【left > right】条件成立,表示查找结束
        if(left > right){
   
     
            return -1;
        }
        // 中间索引
        int middle = (left + right) / 2;
        // 如果查找到的value比array[middle]小,那么左查找。反之,如果查找到的value比array[middle]大,那么右查找。
        if(value < array[middle]){
   
     
            return binarySearch(array,left,middle-1,value);
        }else if(value > array[middle]){
   
     
            return binarySearch(array,middle+1,right,value);
        }else{
   
     
            return middle;
        }
    }

    /**
     * 兩分查找方法
     * 非递归方式实现
     * @param array
     * @param value
     * @return
     */
    public static int binarySearch(int [] array,int value){
   
     
        int left = 0;
        int right = array.length-1;

        while (left <= right){
   
     
            int middle = (left + right) /2;
            if(value == array[middle]){
   
     
                return middle;
            }else if(value > array[middle]){
   
     
                left = middle + 1;
            }else{
   
     
                right = middle -1;
            }
        }
        return -1;
    }
}

执行结果:

原始数据:[-7, -4, -2, 5, 8, 10]
【二分查找】结果下标位置:3
【二分查找】非递归方式查找结果下标位置:5

1.3 二分查找总结

  • 算法优点:折半查找的时间复杂度为O(logn),远远好于顺序查找的O(n)。
  • 算法缺点:虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
  • 适用场景:二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。