redjh

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

 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

分类:

java

技术点:

相关文章: