二分查詢演算法

2021-10-22 16:55:27 字數 2032 閱讀 9692

​ 例子說明:請對乙個有序陣列進行二分查詢 ,輸入乙個數看看該陣列是否存在此數,並且求出下標,如果沒有就提示"沒有這個數"。

​ 通常對於查詢某個數在,陣列中的位置時,我們會直接遍歷整個陣列,對其一一比較,最終獲得我們的想要查詢數的指定位置。但是這種方式太過於消耗記憶體,特別是當陣列的資料特別大的時候,其效果就顯得更加的差勁了。

​ 基於對於查詢乙個數在某個陣列的指定位置的目的,我們採取了二分查詢演算法。

二分查詢演算法的思路便是,首先設定最左與最右的數的下標,其次通過引用乙個中間變數作為比較物件,當所查詢數小於中間數時,便向左查詢,最右數的下標變成中間數-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...