public class LinearSearch { /** * * @param arr 要查找的数组 * @param findVal 要查找的值 * @return 返回对应值的下标,若是没有返回-1 */ public static int linearSearch(int[] arr, int findVal){ if (arr == null || arr.length <= 0 ) return -1; for (int i = 0; i < arr.length; i ++){ if (arr[i] == findVal) return i; } return -1; } public static void main(String[] args) { int[] arr = {128,321,23,4,19,23,10,98,100}; int result = linearSearch(arr, 10); System.out.println(result); } }
基本思路:算法
2)把要找的值findVal和下标mid对应的值midVal进行比较数组
举例说明:好比有序数组{1,8,9,10,29,39,49,69},查找39spa
代码以下:code
/** * 使用折半查找的前提是该数组是有序的 */ public class BinarySearch { public static int binarySearch(int[] arr, int findVal){ if (arr == null || arr.length <= 0) return -1; return binarySearch(arr, 0, arr.length - 1, findVal); } public static int binarySearch(int[] arr, int left, int right, int findVal){ if (left > right) return -1; int mid = (left + right) / 2; int midVal = arr[mid]; if (findVal < midVal){ return binarySearch(arr, left, mid - 1, findVal); }else if (findVal > midVal){ return binarySearch(arr, mid + 1, right, findVal); }else { return mid; } } public static void main(String[] args) { int[] arr = {1,4,9,29,98,100,989}; int result = binarySearch(arr, 10); System.out.println(result); } }
基本思路:blog
举个例子:好比有序数组{1,8,9,10,29,39,49,69},查找39递归
代码以下:ci
public class InsertSearch { public static int insertSearch(int[] arr, int findVal){ if (arr == null || arr.length <= 0) return -1; return insertSearch(arr, 0, arr.length - 1, findVal); } /** ** @param arr 有序数组 * @param left 左边的下标 * @param right 右边的下标 * @param findVal 要找的值 * @return findVal对应的下标,若是找不到则返回-1 */ public static int insertSearch(int[] arr, int left, int right, int findVal){ //如下三个判断条件必须写 //第一个:当找不到的时候left会大于right //第二个和第三个:若是说要找的值不在该数组的最大值和最小值的范围里(对于升序的数组来讲) // 那么若是不加这两个条件,可能会致使最后算出来的mid不在left和right之间 if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) return -1; int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]); int midVal = arr[mid]; if (findVal > midVal){ return insertSearch(arr, mid + 1, right, findVal); }else if (findVal < midVal){ return insertSearch(arr, left, mid - 1, findVal); }else { return mid; } } public static void main(String[] args) { int[] arr = {1,8,9,10,29,39,49,69}; System.out.println(Arrays.toString(arr)); int result = insertSearch(arr, 39); System.out.println(result); } }
介绍:利用斐波那契数列找到数组中的黄金分割点it
基本思路:class
F(k-1)是什么?容器
while(n > F(k)) k++
举个例子:好比有序数组{1,8,9,10,29,39,49,69},查找39
2)第一轮,根据公式计算出mid=4,arr[mid]=29,小于39,向右查找
3)第二轮,arr[mid] = arr[6] = 49,大于39,向左查找
k -= 2和 k --的含义:
public class FibonacciSearch { private static int maxSize = 100; private static int count = 0; private static int[] fib(){ int[] f = new int[maxSize]; f[0] = 1; f[1] = 1; for (int i = 2; i <= maxSize - 1; i ++){ f[i] = f[i - 1] + f[i - 2]; } return f; } //斐波那契查找算法 public static int fibSearch(int[] arr, int findVal){ return fibSearch(arr, 0, arr.length - 1, findVal); } /** * * @param arr 有序数组 * @param low 数组左边的下标 * @param high 数组右边的下标 * @param findVal 要查找的值 * @return 找到的值对应的下标,若是没有返回-1 */ public static int fibSearch(int[] arr, int low, int high, int findVal){ if (arr == null || arr.length <= 0 ) return - 1; int k = 0; //表示斐波那契数列的下标 int[] f = fib(); //获取斐波那契数列 int mid = 0; //mid值 //获取斐波那契分割数值 while (high > f[k] - 1){ k ++; } //把k与n进行比较,若是n小就须要进行扩容 int[] temp = Arrays.copyOf(arr, f[k]); //把扩容多出来的数赋予原来arr的最后一个数据 for (int i = high + 1; i < temp.length; i ++){ temp[i] = arr[high]; } System.out.println("查找以前的工做:"); System.out.println("t扩容后的数组arr:" + Arrays.toString(temp)); System.out.println("tleft:" + low); System.out.println("tright:" + high); System.out.println("tk:" + k); //使用while循环,找到咱们的数Key while (low <= high){ //设置中间点 mid = low + f[k-1] - 1; System.out.println("这是第" + ++count +"轮:"); System.out.println("tleft:" + low); System.out.println("tright:" + high); System.out.println("tk:" + k); System.out.println("tf[k-1]-1:" + (f[k-1] -1)); System.out.println("tmid:" + mid); if (findVal < temp[mid]){ high = mid - 1; //这里为何是k -- //一、所有元素 = 前面的元素 + 后边的元素 //二、f(k) = f(k-1) + f(k-2) //三、前面有f(k-1)个元素,因此能够继续拆分,f(k-1) = f(k-2)+f(k-3) k --; }else if (findVal > temp[mid]){ low = mid + 1; //为何是k -= 2 //一、所有元素 = 前面的元素 + 后面的元素 //二、f(k) = f(k-1) + f(k-2) //三、由于咱们有f[k-2],因此能够继续拆分f[k-2]=f[k-3]+f[k-4] //四、即在f[k-2]的前面进行查找 //五、下次循环mid = f[k - 1 - 2] - 1 k -= 2; }else { if (mid <= high){ return mid; }else { return high; } } } return -1; } public static void main(String[] args) { int[] arr = {1,8,9,10,29,39,49,69}; int resultIndex = fibSearch(arr, 39); System.out.println(resultIndex); } }