1.二分查找法(折半查找):减少查找序列的长度,分而治之地进行关键字的查找。
优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;
缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
时间复杂度是 O(logn)
2.代码实现:
package com.helq3.search; /** * 二分查找 * @author Helena */ public class binarySearch { //非递归方式执行的查询次数 public static int times = 0; //递归方式执行的查询次数 public static int times2 = 0; /** * @param args */ public static void main(String[] args) { int[] intarr = new int[]{1,2,4,6,9,16,32,56,66,74,89,95};//12= 2的4次方 // 0 1 2 3 4 5 6 7 8 9 10 11 int index = binarySearch(intarr,74); System.out.println("times:"+times+",index:"+ index); int index2 = binarySearch2(intarr,0,intarr.length - 1,74); System.out.println("times:"+times2+",index:"+ index2); } /** * 非递归二分查找法 * @param arr 有序数组 * @param a 要查找的数值 * @return */ public static int binarySearch(int[] arr, int a){ int high = arr.length - 1; int low = 0; while(low <= high){ times ++ ; int mid = (low + high)/2; if(arr[mid]==a){ return mid; }else if(arr[mid] > a){ high = mid -1; }else{ low = mid + 1; } } return -1; } /** * 递归方式实现二分查找 * @param arr 有序数组 * @param low * @param high * @param a 需要查找的值 * @return */ public static int binarySearch2(int[] arr,int low,int high,int a){ if(low > high) return -1; int mid = (low + high)/2; times2++; if(arr[mid] == a){ return mid; }else if(arr[mid] > a){ high = mid -1; return binarySearch2(arr,low,high,a); }else{ low = mid + 1; return binarySearch2(arr,low,high,a); } } }
总结一句:好好学习,天天向上,此文借鉴了 https://www.cnblogs.com/xiexiandong/p/13057633.html,感谢博主。