Scala練習-插值查找

原理
源碼

package day15


import day14.Utils
import day15.BinarySearch.printlnArray

import scala.collection.mutable.ArrayBuffer

/**
  * Created by doctorq on 2017/6/30.
  * 插值查找:改進二分查找的算法,在數值範圍比較大,分佈比較均勻時可以採用插值查找來取代二分查找
  * 切分的索引值不再是之前的中間位置,根據待查找的數值的權重來計算切分的索引值
  */
object InsertSearch extends App with Utils {
  def search(unSorted: Array[Int], find: Int): Unit = {
    val size = unSorted.size
    if (size == 0) {
      println(s"${find} no find")
      return
    }
    printlnArray(unSorted)
    val index =
      (size - 1) * (find - unSorted(0)) / (unSorted(size - 1) - unSorted(0))

    val flag = unSorted(index)

    if (find == flag) {
      println(s"find ${index}")
      return
    } else if (find > flag) {
      val right = subArray(unSorted, index + 1, size - 1)
      search(right, find)
    } else {
      val left = subArray(unSorted, 0, index - 1)
      search(left, find)
    }
  }

  def subArray(parent: Array[Int], start: Int, end: Int): Array[Int] = {
    val subArray = new ArrayBuffer[Int]()
    for (i <- start to end) {
      subArray.append(parent(i))
    }
    subArray.toArray
  }

  val list = Array(1, 3, 4, 2, 5, 5, 6, 9, 3, 4, 4)

  search(list.sorted, 3)

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章