基础算法 二分查找

用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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值