資料結構 二分查詢(演算法)

2021-10-02 07:05:49 字數 2514 閱讀 6157

二分查詢要求陣列必須有序,如果陣列無序,需對陣列進行排序操作

首先確定陣列中間值的下標: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...