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); } }