二分查詢要求陣列必須有序,如果陣列無序,需對陣列進行排序操作
首先確定陣列中間值的下標:mid = (left+right)/2;
讓需要查詢的值findvalue與arr[mid]進行比較:
1)如果無它要求,直接返回mid即可;
2)如果需要查詢第乙個元素位置,需要向左迴圈,查詢mid前面是否還有滿足需求的值,如果存在,則將對應值的索引賦給mid,直到不存在,返回mid即可;
3)如果需要查詢最後乙個元素位置,需要向右迴圈,查詢mid後面是否還有滿足需求的值,如果存在,則將對應值的索引賦給mid,直到不存在,返回mid即可;
4)如果是查詢所有值,則分別向左、向右迴圈查詢是否存在滿足需求的值,如果存在,將它們依次加入到乙個集合中,最後以集合的形式返回索引值即可,不要忘記將mid也要加入到待返回的集合中去;
4. 遍歷整個陣列(即left>right)仍未找到指定值,說明陣列中不存在該值,返回-1或空集合即可。
查詢陣列中第乙個元素位置、最後乙個元素位置或任意位置:
/**
* 二分查詢獲取陣列內第乙個或最後乙個指定元素的位置
** @param array 有序陣列,如果無序,需對陣列先進行排序
* @param left 左起始值
* @param right 右結束值
* @param findvalue 要查詢的值
* @return 找到返回指定元素的index, 未找到,返回-1
*/private static int binarysearchfirstvalue(int array, int left, int right, int findvalue)
int mid = (0 + array.length) / 2;
/*如果中間值大於要查詢的值,需要向左遞迴查詢*/
if (array[mid] > findvalue) else if (array[mid] < findvalue) else else
// }
// return mid;
/*如果是查詢最後乙個元素的位置,向右檢索,看是否有元素與查詢值相等,直到不等,返回mid即可*/
// for (int i = mid + 1; i < array.length; i++) else
// }
// return mid;
}}
查詢陣列中全部元素位置:
/**
* 查詢陣列內所有指定元素的值
** @param array 陣列
* @param left 起始位置
* @param right 結束位置
* @param findvalue 待查詢值
* @return 全部元素索引集合
*/private static listbinarysearchallvalue(int array, int left, int right, int findvalue)
int mid = (0 + array.length) / 2;
/*如果中間值大於要查詢的值,需要向左遞迴查詢*/
if (array[mid] > findvalue) else if (array[mid] < findvalue) else else
}/*將中值新增到列表*/
indexes.add(mid);
/*向右迴圈,將滿足條件值的index新增到列表*/
for (int i = mid + 1; i < array.length; i++) else
}return indexes;
}}
測試**:
public class binarysearchutil ;
// int findvalue = 10;
int findvalue = 8;
int index = binarysearchfirstvalue(array, 0, array.length, findvalue);
system.out.printf("第乙個 %d 的位置是:%d\n", findvalue, index);
// index = binarysearchfirstvalue(array, value);
system.out.printf("所有 %d 的位置是:%s\n", findvalue, binarysearchallvalue(array, 0, array.length, findvalue).tostring());
}}
資料結構 二分查詢演算法
1.請自行學習二分查詢演算法,並實現以下函式 1.1 在乙個已排序的整型陣列array中,假設已知array陣列的元素個數為n,需要查詢的關鍵值為key,要求在array陣列中查詢值為key的數字,並返回該數字在陣列中對應的索引值。請設計並實現該函式。include int bsearch1 int...
資料結構查詢演算法(二分查詢)
參考例子 後記 二分查詢演算法,說白了就是在有序的陣列裡面給予乙個存在陣列裡面的值key,然後將其先和陣列中間的比較,如果key大於中間值,進行下一次mid後面的比較,直到找到相等的,就可以得到它的位置。首先確定整個查詢區間的中間位置mid strat end strat 2 用待查關鍵字key值與...
資料結構與演算法 二分查詢
二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...