二分查找這個概念是很是簡單的一個算法,也就是咱們俗稱的折半查找,原理是在一個有序的數組中,先取中間的值,若是中間值大於或者小於咱們須要查找的值,那麼就捨棄通常,在另外一半中進行查找.java
下面是一個簡單的二分查找:算法
package com.hotusm.algorithm.insertvaluesearch; import java.util.Arrays; /** * @author Hotusm <br/> * @date 2017年4月3日 <br/> * @description */ public class InsertValueSearch { public static boolean search(int[] arr,int key,int left,int right){ while(left<right){ // 二分 int middle=(left+right)/2; if(arr[middle]==key){ return true; } if(key<arr[middle]){ right=middle-1; }else{ left=middle+1; } } return false; } public static void main(String[] args) { int[] arr=new int[]{2,3,45,1234}; Arrays.sort(arr); System.out.println(search(arr, 45, 0, arr.length-1)); } }
這種方式的查找實際上是將值構形成了一顆二叉排序數,而後進行查找.這種搜索的好處在於大大的縮短了搜索時間,時間複雜度爲logn 小於線性的n數組
而插值查找則比較靈活,並非簡單的從中間進行的,它是根據咱們須要查詢的值的漸進進行搜索的.spa
插值查找的不一樣點在於每一次並非從中間切分,而是根據離所求值的距離進行搜索的.code
下面是算法:blog
package com.hotusm.algorithm.insertvaluesearch; import java.util.Arrays; /** * 插值查找 * @author Hotusm <br/> * @date 2017年4月3日 <br/> * @description */ public class InsertValueSearch { public static boolean search(int[] arr,int key,int left,int right){ while(left<right){ int middle=left+(right-left)*((key-arr[left])/(arr[right]-arr[left])); if(arr[middle]==key){ return true; } if(key<arr[middle]){ right=middle-1; }else{ left=middle+1; } } return false; } public static void main(String[] args) { int[] arr=new int[]{2,3,45,1234}; Arrays.sort(arr); System.out.println(search(arr, 45, 0, arr.length-1)); } }