[JAVA]插值搜尋(Interpolation search)

  // 進行InterpolationSeach前提,先準備好有序陣列
  // 優勢:適合用於陣列值為較連續的、值的差距不大、資料量大
  // 唯有取得中間值公式與二分搜尋不同,剩餘作法一致
// 插值搜尋
public class InterpolationSearch {

  public static void main(String[] args) {
    int[] array = {1,4,23,23,23,56,356,754,975};
    int index = doInterpolationSearching(array, 0, array.length-1, 975);
    System.out.println("index = " + index);
  }

  /**
   * 在陣列中找到目標值即回傳索引
   * 找不到即回傳-1
   * @param array
   * @param left
   * @param right
   * @param value
   * @return
   */
  public static int doInterpolationSearching(int[] array, int left, int right, int value) {
    System.out.println("call function now~");
    // 由於目標值(value)有參與中間值索引(middle)計算,怕索引越界,所以必須防呆
    if (left > right || value < array[0] || value > array[array.length-1]) {
      return -1;
    }
    // 中間索引
    int middle = left + (right - left) * (value - array[left]) / (array[right] - array[left]);
    int middleVal = array[middle];
    if (value < middleVal) { // 向左遞歸
      return doInterpolationSearching(array, left, middle-1, value);
    } else if (value > middleVal) { // 向右遞歸
      return doInterpolationSearching(array, middle+1, right, value);
    } else {
      return middle;
    }
  }

}

如有敘述錯誤,還請不吝嗇留言指教,thanks!