二分查找算法学习记录之两种实现方式
二分查找算法,也称折半查找,是一种效率较高的查找算法。使用要求:线性表必须是顺序储存结构,且表中元素按关键字有序排列。
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步