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