最優雅的二分查找

今天覆習之前的代碼,忽然發現插入排序用的二分查找算法實現得很彆扭,因而試試重寫一個,沒想到至關順利,幾分鐘就寫好並測試經過了:算法

static int BinarySearch(int[] array, int value, int start, int end) 
{ 
    if(start == end) return start; 
    var middle =  (start + end)/2 + 1; 
    if(value >= array[middle]) 
        return BinarySearch(array, value, middle, end); 
    else 
        return BinarySearch(array, value, start, middle - 1); 
}

要說明一下,這是用查找升序數組的,結果是小於等於value(被查找值)的最後一個元素的位置。好比說序列{1,3,5,5,7,9},查找5,返回3;查找6,也返回3;查找8,則返回4。數組

這樣很是方便與其餘算法合做,比入插入排序,不容易出現索引溢出錯誤。下面是非遞歸版本:測試

static int BinarySearch2(int[] array, int value, int start, int end) 
{ 
    while (true) { 
        if(start == end) return end; 
        var middle = (start + end)/2 + 1; 
        if(value >= array[middle]) 
            start = middle; 
        else 
            end = middle - 1; 
    } 
}

據我所知,這恐怕是最精簡最優雅的實現了,若是有更好的,歡迎來指導。至於降序數組的狀況該怎麼寫,請注意計算中間值位置middle,以及下一行與中間值的比較方式,你會發現其中的微妙 <( ̄︶ ̄)>blog

相關文章
相關標籤/搜索