• 二分查找算法学习记录之两种实现方式


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

     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

  • 相关阅读:
    基于cocos2d-x的跑酷游戏,不同高度地面的碰撞检測demo,有兴趣能够看一看
    Dynamics CRM Form表单中通过javascript抓取触发change事件字段的属性名
    【项目实战】---使用ajax完毕username是否存在异步校验
    任务调度(三)——Timer的替代品ScheduledExecutorService简单介绍
    UML——用例图
    frameset怎样实现整个页面的跳转
    linux下怎样用c语言调用shell命令
    替换谷歌自带的安卓开发虚拟机?何不试试以下的虚拟机
    android环境下两种md5加密方式
    IOS-Storyboard控制器切换之Modal(1)
  • 原文地址:https://www.cnblogs.com/redjh/p/8464799.html
Copyright © 2020-2023  润新知