现在比较常用几种查找算法分别为顺序查找,二分查找,插值查找,裴波那契查找这四种算法。
顺序查找不用多说,大家都在用。
二分查找
二分查找又称折半查找,它是一种效率较高的查找方法。
要求:要查找的顺序必须是有序的。
基本思想:
将要查找的数据拆分成一半一半。
mid为中间值,比mid小的去左边查,比mid大的去右边查。
然后循环往复直到遍历结束或者找到要查询的值
/*** 二分查找* @param arr 要查询的数组* @param left 左边的索引* @param right 右边的索引* @param val 要查询的值* @return 返回index,-1 为未找到*/public static int binarySearch(int[] arr, int left, int right, int val) {//递归出口,遍历完成但是没有找到值。if (left > right) {return -1;}int mid = (left + right) / 2;int midVal = arr[mid];if (val > midVal) {return binarySearch(arr, mid + 1, right, val);}else if (val < midVal) {return binarySearch(arr, left, mid - 1, val);}else {return mid;}}
插值查找
插值查找和二分类似,就是mid的公式发生了改变。
其实这几个所谓的查找算法,好像也就mid的公式不一样。
//插值查找public static int interPolationSearch(int[] arr, int left, int right, int findValue) {//防止越界if(left > right || findValue < arr[left] || findValue > arr[right]) {return -1;}//由于取整的关系, a*b/c 不等于 a/c*bint mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);int midVal = arr[mid];if(findValue > midVal) {return interPolationSearch(arr, mid + 1, right, findValue);}else if(findValue < midVal) {return interPolationSearch(arr, left, mid - 1, findValue);}else {return mid;}
