例子說明:請對乙個有序陣列進行二分查詢 ,輸入乙個數看看該陣列是否存在此數,並且求出下標,如果沒有就提示"沒有這個數"。
通常對於查詢某個數在,陣列中的位置時,我們會直接遍歷整個陣列,對其一一比較,最終獲得我們的想要查詢數的指定位置。但是這種方式太過於消耗記憶體,特別是當陣列的資料特別大的時候,其效果就顯得更加的差勁了。
基於對於查詢乙個數在某個陣列的指定位置的目的,我們採取了二分查詢演算法。
二分查詢演算法的思路便是,首先設定最左與最右的數的下標,其次通過引用乙個中間變數作為比較物件,當所查詢數小於中間數時,便向左查詢,最右數的下標變成中間數-1;若所查詢數大於中間數時,向右查詢,最左數變成中間數+1.一直迴圈判斷,直到找到對應的數,或者當最左數大於等於最右數時,結束迴圈,返回查詢數不存在。
例子:a[8]= ,在陣列查詢100018
9102089
1000
1234
241401
2345
678第一步:設定left為最左的數的下標,設定right為最右的數,中間數mid
①left=0,right=8,mid=(left+righ)/2=4
②進行判斷:1000>a[mid]–>1000>a[4]–>1000>20
③所查詢數大於中間數,所以我們需要向右查詢,因為中間數不可能是所查詢數了,所以我們查詢的數應該從中間數+1個的位置開始。
④left=mid+1—>left=5;
第二步:
①left=5,right=8,mid=(left+righ)/2=6 // 這裡我們取整是向下取整
②進行判斷:1000=a[mid]–>1000=a[6]–>1000=1000
③接著我們便直接返回對應的數的下標,即1000的下標6.
/**
* * @param arr 所查陣列
* @param left 最左下標
* @param right 最右下標
* @param findval 所查數
* @return
*/public
static
intbinaryseach
(int
arr,
int left,
int right,
int findval)
int mid=
(left+right)/2
;int midval=arr[mid];if
(findval>midval)
else
if(findvalelse
}
/**
* 查詢某個數在指定陣列中的位置
* @param arr 陣列
* @param target 需查詢的數
* @return
*/public
static
intbinarysearch
(int
arr,
int target)
else
if(arr[mid]
>target)
else
}return-1
;}
public
static
void
main
(string[
] args)
;// 非遞迴方式
int index =
binarysearch
(arr,11)
; system.out.
println
("index="
+index)
;// 遞迴方式
int binaryseach =
binaryseach
(arr,
0, arr.length,
100)
; system.out.
println
("binaryseach="
+binaryseach)
;}
查詢演算法 二分查詢
利用二分查詢演算法查詢某乙個元素,前提條件是該被查詢的元素是乙個已經有序的陣列。二分查詢的思想是將陣列元素的最高位 high 和最低位 low 進行標記,取陣列元素的中間 mid 和和要查詢的值 key 進行比較,如果目標值比中間值要大,則將最低位設定為mid 1,繼續進行查詢。如果目標值小於中間值...
查詢演算法 二分查詢
二分查詢的思路是很簡單的,前提是這組資料是有順序的。思路是從中間找乙個數,判斷大小,如果數比中間數大,說明在中間數到結尾的數中,如果小於,則說明在開始和中間數之間,經過多次相同操作,就可以得到我們想查詢的數時間複雜度就是 o logn 非遞迴的實現 const testarr let i 0whil...
查詢演算法 二分查詢
二分查詢是乙個常用的查詢演算法,其原理在於通過不斷切分乙個規則排序,對半的去尋找目標元素所在的區間與位置。但是其有乙個前提,那就是資料結構需要是順序儲存結構,並且關鍵字大小有序排列。例子如下 例 有乙個數列 12,23,45,56,67,89 請使用二分查詢找到56的位置 解 首先mid 0 5 2...