数据结构之二分查找——Java语言实现

场景描述给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置

首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明待查找的数据不在数据序列中

顺序查找说明:

优点:实现简单,直接一个一个遍历判断即可

缺点:当数据是有序,并且数据不在数据序列中时,会查询N次才能确定数据不在数据序列中,查询次数较高,效率低。

针对有序的数据序列,可以从中间开始进行比较,因为是有序的,若中间值比目标值小,则目标值一定在前半部分序列或者不在序列中,然后依次进行比较。

这种查询方式就是数据结构中的二分查找,使用java语言实现(使用二分查找的前提条件:数据序列是有序的,否则不能使用此种方式)

列举实例:  a[]= {18,21,23,34,56,65,78,88,90,92};  需要查询数据65是否在数据序列中?

使用顺序查找时:需要比较6次才能确定65在数据序列中

使用二分查找时:首先使用数据的中间值(low+high)/2得到 56,然后与65进行比较,56<65,所以数据一定在56的后面序列中;

  然后再65到92中使用此种方式进行比较,{65,78,88,90,92},次数据序列中的中间值是88,88>65,所以数据一定是在65到88之间;

  {65,78}同上方式所示,中间值是65,使用65与65比较,65==65,所以查找到65,一共比较3次,56,88,65;比较次数少于顺序比较,效率更高。

具体代码实现如下所示:

package com.three.fourteen;

public class QuickSort {

    /**
     * 使用二分查找
     * @param args
     */
    
    public int findData(int a[],int tar) {
        int low=0;
        int high=a.length-1;
        int mid;
        while(low<=high) {
            mid=(low+high)/2;
       System.out.println("和 "+a[mid]+" 进行比较");
if(low<high&&a[mid]==tar) return mid; else if(low<high&&a[mid]>tar) high=mid-1; else low=mid+1; } return -1; } public static void main(String[] args) { int a[]= {18,21,23,34,56,65,78,88,90,92}; int tar=65; QuickSort qs=new QuickSort(); int x=qs.findData(a, tar); if(x!=-1) { System.out.println("找到目标数据 65,在数据序列中的第 :"+(x+1) +" 个位置"); }else { System.out.println("没有找到目标数据 65"); } } }

运行结果:

原文地址:https://www.cnblogs.com/guopengxia0719/p/10534030.html