歡迎**,如有錯誤敬請指正
二分搜尋使用的前提是陣列必須有序,在本文中,我們用lo(low)表示查詢範圍的起始下標,hi(hight)表示查詢範圍的結束下標,mid表示lo和hi的中間位置。
1. 一般情況二分搜尋
/*普通二分搜尋,如果找到key,返回任意乙個和key相等的元素下標,否則返回-1*/現在我們來看正常的二分搜尋,我們來討論一下如果沒有找到這這個元素時,lo和hi下標的元素值和key的大小關係。如果沒有找到key,最後乙個查詢的位置一定是lo == hi的位置,下標lo之前元素的一定比key小,下標hi之後元素的一定比key大。如果當前位置(即lo和hi的下標)比key大,hi減小1;如果當前位置比key小,lo增加1。總之lo會比hi大1,結束迴圈。如果沒有找到key,lo和hi兩者之一有可能越界,hi越界時 hi為-1,lo越界時lo為a.length。在沒有越界的情況下,迴圈結束以後,a[hi] < key,a[lo] > key。所以, 如果沒有找到這這個元素,a[hi]是小於key中最接近key的值,a[lo]是大於key中最接近key的值。public static int find(int a, int key)else if(a[mid] < key)else
} return -1;
}
2. 最小下標二分搜尋
問題:如果不存在key,返回-1, 如果存在key,返回和key相等的元素中的最小的下標。
思路:如果a[mid] == key 則用lastfind記錄下mid,然後在[lo, mid-1]中繼續繼續查詢,如果在這個新範圍內還能找到和key相等的元素下標,則替換lastfind,然後更新lo和hi,繼續迭代上述過程,直到lo > hi;如果沒有找到,lastfind就是最小下標 。
/*如果不存在目標元素,返回-1, 如果存在目標元素,返回和目標元素相等中下標最小的*/同理,我們可以解決大於等於key的元素個數的問題。public static int findwithminindex(int a, int key)else if(a[mid] < key)else
} return lastfind;
} /*上述問題的第二種實現方法
public static int findwithminindex(int a, int target)else
} if(lo < a.length && a[lo] == target)else
} */
3. 小於key的元素個數
整個陣列中的元素可以分為兩種,大於等於key的和小於key的。如果a[mid] >= key下乙個查詢的範圍是[lo, mid-1],如果a[mid] < key下乙個查詢的範圍是[mid+1, hi], 直到lo > hi 才退出迴圈。最後乙個查詢的位置一定是lo == hi的位置,lo下標之前的一定小於key,hi下標之後的一定大於等於key。如果當前位置(即lo和hi的下標)的元素值大於等於key,hi減小1;如果當前位置小於key小,lo增加1。所以當迴圈結束時,lo之前下標的元素都是小於key的,而這些元素的個數等於lo。
/*返回陣列元素 = key)else同理,我們可以解決大於key的元素個數的問題。} return lo;
}
4. 小於等於key的元素個數
整個陣列中的元素可以分為兩種,大於key的和小於等於key的。如果a[mid] > key下乙個查詢的範圍是[lo, mid-1],如果a[mid] <= key下乙個查詢的範圍是[mid+1, hi],直到lo > hi 才退出迴圈。最後乙個查詢的位置一定是lo == hi的位置,lo下標之前的一定小於等於key,hi下標之後的一定大於key。如果當前位置(即lo和hi的下標)的元素值大於key,hi減小1;如果當前位置小於等於key小,lo增加1。所以當迴圈結束時,lo之前下標的元素都是小於等於key的,而這些元素的個數等於lo。
/*返回 陣列元素中 <=key 的元素個數*/同理,我們可以解決大於等於key的元素個數的問題。public static int findlessequalcnt(int a, int key)else
} return lo;
}
二分搜尋及其擴充套件
二分搜尋需要注意開閉區間的問題,限制條件和邊界要保持配對 low high low mid 1 high mid 1。二分搜尋的模板如下 cpp view plain copy 二分搜尋 intbinarysearch int num,intkey,intlow,inthigh return low...
二分搜尋及其擴充套件
二分搜尋 折半搜尋,也稱二分查詢演算法 二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束 如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一...
二分搜尋及其擴充套件(迴圈遞增陣列的搜尋)
二分搜尋需要注意開閉區間的問題,限制條件和邊界要保持配對 low high low mid 1 high mid 1。二分搜尋的模板如下 cpp view plain copy 二分搜尋 intbinarysearch int num,intkey,intlow,inthigh return low...