zoukankan      html  css  js  c++  java
  • 数据结构之二分查找——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"); } } }

    运行结果:

  • 相关阅读:
    Ansible17:Playbook之tags
    Ansible15:文件管理模块及Jinja2过滤器
    Ansible16:Playbook高级用法
    Ansible14:Playbook条件语句
    Ansible13:Playbook循环语句
    etcd备份与恢复
    Kafka部署篇
    kafka原理篇
    Zookeeper的介绍与基本部署
    frp实现内网穿透
  • 原文地址:https://www.cnblogs.com/guopengxia0719/p/10534030.html
Copyright © 2011-2022 走看看