def binarySearch[A](as:Array[A], key:A, gt:(A,A) =>Boolean) :Int ={
@annotation.tailrec
def go(low: Int, mid:Int, high:Int): Int ={
if(low > high) -mid-1
else{
val mid2 = (low+high)/2
val a = as(mid2)
val greater = gt(a,key)
if (!greater && !gt(key,a)) mid2
else if(greater) go(low,mid2,mid2-1)
else go(mid2+1,mid2,high)
}
}
go(0,0,as.length - 1)
}
测试
binarySearch[Int](Array(1,2,3,4,5),3,_>_)
测试2
/**
* Created by DGA on 2016/2/2.
*/
object Main extends App {
// your code goes here
def binarySearch[A](ds: Array[A], key: A, gt: (A, A) => Boolean): Int = {
def go(low: Int, mid: Int, high: Int): Int = {
val mid = (high + low)/2
val d = ds(mid);
if(!gt(d, key) && !gt(key, d)) mid
else if(gt(d, key)) go(low, mid, mid -1)
else go(mid+1, mid, high)
}
go(0, 0, ds.length - 1)
}
def formatResult(array: Array[Int], key: Int, f: (Array[Int], Int, ((Int, Int) => Boolean)) => Int) = {
val msg = "The key is a %d th position"
// msg.format(f(array, key, ((x: Int, y:Int) => x > y)) + 1)
msg.format(f(array, key, (_ > _)) + 1)
}
override def main(args: Array[String]): Unit = {
println(formatResult(Array(1,2,3,4,5,6), 2, binarySearch))
}
}
http://ju.outofmemory.cn/entry/221845
https://windor.gitbooks.io/beginners-guide-to-scala/content/chp10-staying-DRY-with-higher-order-functions.html
http://blog.csdn.net/v_july_v/article/details/7093204