二分搜索法的優勢和劣勢
優點是比較次數少,搜索速度快,平均性能好;
它的缺點是要查找的列表要求是有序的,而且很難插入和刪除。
因此,對半查找的方法適用於查找不頻繁變化的頻繁有序列表。
使用條件:搜索序列是序列結構,有序。
過程
首先,假設表格中的元素按升序排列,將記錄在表格中間的關鍵詞與搜索關鍵詞進行比較,如果相等,則搜索成功;否則,使用中間位置記錄將表分成兩個子表。如果中間位置記錄的關鍵字大於搜索關鍵字,則進壹步搜索前面的子表,否則進壹步搜索後面的子表。重復上述過程,直到找到滿足條件的記錄使搜索成功,或者直到子表不存在,此時搜索不成功。
利用循環實現二分法搜索
公共類二進制搜索{
公共靜態void main(String[] args) {
//生成隨機數組int[]array = suiji();
//對數組進行排序。排序(數組);
System.out.println("生成的隨機數組是"+arrays . tostring(array));
System.out.println("要查找的值:");
掃描儀輸入=新掃描儀(system . in);
//搜索的目標值int aim = input . nextint();
//用二分法求int index =二分搜索法(array,aim);
System.out.println("搜索值的索引位置:"+index);
}
/* * *生成隨機數組*
* @return返回值,返回隨機數組*/
private static int[] suiji() {
// random.nextInt(n)+m?返回隨機數int n = new Random()。m和m+n-1之間的nextInt(6)+5;
int[]array = new int[n];
//循環遍歷為數組賦值(int I = 0;我& lt數組.長度;i++) {
array[i] = new Random()。nextInt(100);
}
返回數組;
}
/* * *二分法搜索?-循環方式實現*
* @ Paraarray查找數組* @ Paraaim查找值* @return返回值,成功返回索引,或-1 */
private static int binary search(int[]array,int aim) {
//數組int left的最小索引值= 0;
//數組最大索引值int right = array . length-1;
int mid
while(left & lt;=右){
mid =(左+右)/2;
//如果搜索值小於中間值,如果(Aim
右= mid-1;
//如果搜索值大於中間值,則將整個搜索範圍的後壹半作為新的搜索範圍} else If(aim >;array[mid]) {
left = mid+1;
//如果搜索數據正好等於中間元素值,放回中間元素值的索引?}否則{
返回mid
}
}
return-1;
}}
操作結果演示:
從上面的運行結果我們知道,如果要查找的數據存在於數組中,則輸出數組中數據的索引;如果不存在,輸出-1,即打印-1,數組中不存在該數,否則存在。
第四,二分搜索法是通過遞歸實現的。
公共類BinarySearch2 {
公共靜態void main(String[] args) {
//生成隨機數組int[]array = suiji();
//對數組進行排序。排序(數組);
System.out.println("生成的隨機數組是"+arrays . tostring(array));
System.out.println("要查找的值:");
掃描儀輸入=新掃描儀(system . in);
//搜索的目標值int aim = input . nextint();
//用二分法求int index =二分搜索法(array,aim,0,array。長度-1);
System.out.println("搜索值的索引位置:"+index);
}
/* * *生成隨機數組* * @返回返回值,返回隨機數組*/
private static int[] suiji() {
// Random.nextInt(n)+m?返回隨機數int n = new Random()。m和m+n-1之間的nextInt(6)+5;
int[]array = new int[n];
//循環遍歷為數組賦值(int I = 0;我& lt數組.長度;i++) {
array[i] = new Random()。nextInt(100);
}
返回數組;
}
/* * *二分法搜索-遞歸方式* * @ Paraarray求數組* @ Paraaim?要查找的值* @param left?左邊的最小值* @param right,右邊的最大值* @return返回值,索引返回成功,-1 */
private static int binary search(int[]array,int aim,int left,int right) {
if(aim & lt;array[left]| | aim & gt;數組[右]) {
return-1;
}
//求中間值int mid =(left+right)/2;
if (array[mid] == aim) {
返回mid
} else if(array[mid]& gt;目標){
//如果中間值大於要求的值,繼續從左半部分遞歸返回二分搜索法(array,aim,left,mid-1);
}否則{
//如果中間值小於要求的值,繼續遞歸返回二分搜索法(array,aim,mid+1,array。長度-1);
}
}}
操作結果演示:
總結:
與循環相比,遞歸的代碼更簡單,但它消耗更多的時間和空間,效率很低。在實際學習和工作中,根據情況選擇使用。通常如果我們用loop來實現代碼,只要不是太繁瑣,我們就選擇loop來實現~