用Groovy写的,复习二分查找
array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
length = array.size()
def checkIndex(def num, int index){
println "Index of number " + num + " is " + index;
}
def search = {
binarySearch()
}
//调用Search
search()
//=============================使用递归的二分查找==================================
def binarySearch(){
for(int i=0; i<length; i++){
def num = array[i]
//使用递归的二分查找
println "---- Recursion ----"
int index = searchRecursion(num, 0, length)
checkIndex(num, index)
//不使用递归,使用循环体
println "==== No Recursion ===="
index = searchNoRecursion(num)
checkIndex(num, index)
}
println "\n Can not find test:"
for(int i=100; i<=105; i++){
//使用递归的二分查找
println "---- Recursion ----"
int index = searchRecursion(i, 0, length)
checkIndex(i, index)
//不使用递归,使用循环体
println "==== No Recursion ===="
index = searchNoRecursion(i)
checkIndex(i, index)
}
}
def searchRecursion(def num, int l, int r){
if(l <= r){ //注意,这里必须包含小于和等于,否则会有部分元素查找失败
int m = (l + r) / 2
println "[ " + l + " - " + r + " ]"
if(array[m] == num){
return m
}else if(array[m] > num){
return searchRecursion(num, l, m-1)
}else{
return searchRecursion(num, m+1, r)
}
}else{
return -1
}
}
def searchNoRecursion(def num){
int l = 0, r = length-1
while(l <= r){
println "[ " + l + " - " + r + " ]"
int m = (l + r) / 2
if(array[m] == num){
return m
}else if(array[m] < num){
l = m+1 //注意这里的左界限和右界限的变化,不能直接取m
}else{
r = m-1
}
}
return -1
}