zoukankan      html  css  js  c++  java
  • 二分查找算法学习记录之两种实现方式

      二分查找算法,也称折半查找,是一种效率较高的查找算法。使用要求:线性表必须是顺序储存结构,且表中元素按关键字有序排列。

     1 public class Test {
     2     /**
     3      * 冒泡排序
     4      *
     5      * @param arr 整数数组
     6      */
     7     public static void bubble(int[] arr) {
     8         int swap;
     9         int len = arr.length;
    10         for (int i = 0; i < len; i++) {
    11             for (int j = i; j < len; j++) {
    12                 if (arr[j] < arr[i]) {
    13                     swap = arr[i];
    14                     arr[i] = arr[j];
    15                     arr[j] = swap;
    16                 }
    17             }
    18         }
    19     }
    20 
    21     /**
    22      * 二分查找算法(循环)
    23      *
    24      * @param arr 目标数组
    25      * @param tag 查询目标值
    26      * @return tag在arr中的索引,未找到返回-1
    27      */
    28     public static int binarySearch(int[] arr, int tag) {
    29         int left = 0;
    30         int right = arr.length - 1;
    31         int middle;
    32         //循环条件若不加等号,会查询不到首尾数据
    33         while (left <= right) {
    34             middle = (right + left) / 2;
    35             System.out.println("left: " + left + "   right: " + right + "   middle: " + middle);
    36             if (tag == arr[middle]) {
    37                 return middle;
    38             } else if (tag < arr[middle]) {
    39                 right = middle - 1;
    40             } else {
    41                 left = middle + 1;
    42             }
    43         }
    44         System.out.println("跳出循环: left: " + left + "   right: " + right);
    45         return -1;
    46     }
    47 
    48     /**
    49      * 二分查找算法(递归)
    50      *
    51      * @param arr   目标数组
    52      * @param tag   查询目标值
    53      * @param start 起始位置
    54      * @param end   结束位置
    55      * @return tag在arr中的索引,未找到返回-1
    56      */
    57     public static int binarySearch(int[] arr, int tag, int start, int end) {
    58         int middle = (start + end) / 2;
    59         if (tag < arr[start] || tag > arr[end] || start > end) {
    60             return -1;
    61         }
    62         if (tag < arr[middle]) {
    63             return binarySearch(arr, tag, start, middle - 1);
    64         } else if (tag > arr[middle]) {
    65             return binarySearch(arr, tag, middle + 1, end);
    66         } else {
    67             return middle;
    68         }
    69     }
    70 
    71     public static void main(String[] args) {
    72         int[] a = {1, 3, 2, 22, 4, 55, 21, 9, 10, 88, 12};
    73         bubble(a);
    74         System.out.println("冒泡排序后的数组: "+Arrays.toString(a));
    75         System.out.println("循环二分查找: " + binarySearch(a, 88));
    76         //end的值若超过数组下标长度,会抛出数组越界异常
    77         System.out.println("递归二分查找: " + binarySearch(a, 3, 0, a.length - 1));
    78 
    79     }
    80 }

      运行程序,输出的结果:

        冒泡排序后的数组: [1, 2, 3, 4, 9, 10, 12, 21, 22, 55, 88]
        left: 0   right: 10   middle: 5
        left: 6   right: 10   middle: 8
        left: 9   right: 10   middle: 9
        left: 10   right: 10   middle: 10
        循环二分查找: 10
        递归二分查找: 2

  • 相关阅读:
    ElasticSearch2.3.1环境搭建哪些不为人知的坑
    don't run elasticsearch as root.
    翻译 Asp.Net Core 2.2.0-preview1已经发布
    微信小程序与AspNetCore SignalR聊天实例
    .Net Core扩展 SharpPlugs简单上手
    Docker折腾手记-linux下安装
    C#3.0 扩展方法
    微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践
    C#3.0智能的编译器
    C#3.0导航
  • 原文地址:https://www.cnblogs.com/redjh/p/8464799.html
Copyright © 2011-2022 走看看