zoukankan      html  css  js  c++  java
  • 有序数列的二分搜索

     二分查找

     前提:可以使用二分搜索的前提是该数组是一个有序的数组。

    (若不是有序数组,可使用Array.sort(arr)方法进行排序)

    一,分析二分搜索的过程

     二,代码实现

    import java.util.*;
    public class HW3 {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in); //输入要查找的数
    System.out.println("请输入要打印的数据:");
    int number = in.nextInt();
    Random rd = new Random(); //在数组中随机,注:范围是在打印时标示
    int[] arr = new int[11];
    for (int i = 0; i < 11; i++) //对数组的11个数,开始分配值
    {
    arr[i] = rd.nextInt(50); //0-49 //对这11个数组赋值
    }
    Arrays.sort(arr); // 因为二分搜索是对有序数列使用的,所以先对数组中的数排序
    System.out.println(Arrays.toString(arr)); //将有序数组打印出来
    int index = Search(arr, number); //调用search()方法(二分搜索)进行查找
    if(index==-1){ //若返回的是-1,则没有找到数
    System.out.println("没有查找到该数!!!");
    }else{ //若返回为下标,则表示找到了该数
    System.out.println("查找的数下标为:"+index);
    }


    }

    private static int Search(int[] arr, int number) { //将所要遍历的数组和所要查找的数值赋给该方法
    int start = 0; //先定义三个变量,用来缩减范围
    int end = arr.length - 1;
    int middle = 0;

    while (end >= start) { //end>=start,说明数组还没有查完,则继续查找
    middle = (start + end) / 2;
    if (number < arr[middle]) {
    end = middle - 1;
    } else if (number > arr[middle]) {
    start = middle + 1;
    } else {
    return middle; //当找到该数,则返回下标
    }

    }
    return -1; //若end>start,表明数组已遍历完也没有找到所要找到数,此时返回-1;
    }
    }

    三,运行结果: 

     

    以上是二分查找的代码实现,其实在Java中已经有可以直接调用的二分查找函数,使用方法具体如下:

     1 import java.util.*;
     2 public class HW3 {
     3     public static void main(String[] args) {
     4         Scanner in = new Scanner(System.in);      //输入要查找的数
     5         System.out.println("请输入要打印的数据:");
     6         int number = in.nextInt();
     7         Random rd = new Random();       //在数组中随机,注:范围是在打印时标示
     8         int[] arr = new int[11];
     9         for (int i = 0; i < 11; i++)   //对数组的11个数,开始分配值
    10         {
    11           arr[i] = rd.nextInt(50);   //0-49   //对这11个数组赋值
    12         }
    13         Arrays.sort(arr);  // 因为二分搜索是对有序数列使用的,所以先对数组中的数排序
    14         System.out.println(Arrays.toString(arr));    //打印排好序的数组
    15         int index = Arrays.binarySearch(arr, number);  //调用binarysearch()方法(二分搜索)进行查找
    16         if(index<-1){      //若返回的数小于-1,则没有找到数
    17             System.out.println("没有查找到该数!!!");
    18         }else{              //若返回为下标,则表示找到了该数
    19             System.out.println("查找的数下标为:"+index);
    20         }
    21     }
    22 
    23 }

    Arrays.binarySearch(arr,number)方法的底层代码:

        (注意与上述代码不同的是,调用此方法查找数值,若没有找到则返回的是负数,--(insertion point)--1)

     

     Arrays.binarySearch(arr , formindex, endindex, number)方法的底层代码:

     

    四,时间复杂度分析

       当我们进行二分搜索的时候,其搜索过程类似于遍历一个二叉树。

      (左边是小于arr[middle]的情况,右边是大于arr[middle]的情况)

    由图可知,二分搜索的时间复杂度是线性时间,随着层数n的值越来越大,所要遍历的

    数n越来越多,因此花费的时间也越来越多。(因为j越大,花费的时间就越多,所以此处

    可将j看作时间对待)

  • 相关阅读:
    Hard 随机洗牌函数 @CareerCup
    Hard 随机选择subset @CareerCup
    Hard 计算0到n之间2的个数 @CareerCup
    Django admin进阶
    hdu 5630 Rikka with Chess
    PHP 表单验证
    PHP 表单验证
    PHP 表单验证
    PHP 表单验证
    PHP 表单处理
  • 原文地址:https://www.cnblogs.com/ljl150/p/11583792.html
Copyright © 2011-2022 走看看