二分查詢演算法

2021-07-23 15:31:53 字數 2103 閱讀 9817

剛才看到五大常用演算法之一的分治法,分治法有分而治之的思想,把規模不斷的縮小,這樣就會用到遞迴。二分查詢也是分治法的一種實現。

在二分查詢演算法的兩種實現方式中,就有乙個是遞迴的實現方式,另一種就是迴圈的實現方式。

二分查詢演算法實現的前提:已排序的陣列。

二分查詢(折半查詢)演算法原理:將已排好序的陣列,取出最小值的下標(即第乙個值)和最大值的下標(即陣列中的最後乙個值)。根據這兩個值得到陣列的中間值的下標已經所對應的中間值,並根據這個中間值與需要查詢的數進行判斷大小。如果相等,就直接輸出該值。如果中間值小於需要查詢的數,讓迴圈實現或者遞迴實現的最小值範圍變為中間值+1,。如果中間值大於需要查詢的數,讓實現的最大值變為中間值-1。依次縮小範圍,如果這個需要查詢的元素在陣列中就會輸出那個值所對應的下標;如果這個值不在陣列中,就會返回-1。

時間複雜度:

最好的情況肯定是o(1)

平均時間複雜度:o(lgn)

推理過程:   查詢第1次能找到,會定位1個位置,查到的概率是1/n;

查詢第2次能找到,會定位2個位置,查到的概率是2/n;

查詢第3次能找到,會定位4個位置,查到的概率是4/n;

......

查詢第n次能找到,會定位2^m-1個位置,查到的概率是(2^m-1)/n;

由於有n個元素,最多會查m次,根據求和公式

以下是我借鑑別人的**,但是也是自己手動敲上去,明白其中的原委。

為了圖省事,測試和實現的內容都寫在乙個類裡面了。

public class binarysearch 

//計算迴圈的次數

public int showloopcount()

/*** 利用遞迴實現二分查詢

* @param orderarray 已經排好序的陣列

* @param left 陣列最左邊的值

* @param right 陣列最右邊的值

* @param findvalue 查詢的元素

* @return

*/public int recursionbinarysearch(int orderarray, int left, int right, int findvalue) else if(findvalue > middlevalue) else

} else

}/**

* 利用迴圈實現二分查詢

* @param orderarray 已經排好序的陣列

* @param findvalue 查詢的元素

* @return

*/public int loopbinarysearch(int orderarray, int findvalue) else if(findvalue < middlevalue) else

}return -1; //找不到的時候

}public static void main(string args) ;

int findvalue = 9;

int length = orderarray.length;

binarysearch binarysearch = new binarysearch();

int index = binarysearch.recursionbinarysearch(orderarray, 0, length - 1, findvalue);

int retimes = binarysearch.showrecursioncount();

system.out.println("利用遞迴的二分查詢,得到該值在陣列中的位置" + index + ",迴圈次數為" + retimes);

index = binarysearch.loopbinarysearch(orderarray, findvalue);

int looptimes = binarysearch.showloopcount();

system.out.println("利用迴圈實現的二分查詢,得到該值在陣列中的位置" + index + ",迴圈次數為" + looptimes);

}

查詢演算法 二分查詢

利用二分查詢演算法查詢某乙個元素,前提條件是該被查詢的元素是乙個已經有序的陣列。二分查詢的思想是將陣列元素的最高位 high 和最低位 low 進行標記,取陣列元素的中間 mid 和和要查詢的值 key 進行比較,如果目標值比中間值要大,則將最低位設定為mid 1,繼續進行查詢。如果目標值小於中間值...

查詢演算法 二分查詢

二分查詢的思路是很簡單的,前提是這組資料是有順序的。思路是從中間找乙個數,判斷大小,如果數比中間數大,說明在中間數到結尾的數中,如果小於,則說明在開始和中間數之間,經過多次相同操作,就可以得到我們想查詢的數時間複雜度就是 o logn 非遞迴的實現 const testarr let i 0whil...

查詢演算法 二分查詢

二分查詢是乙個常用的查詢演算法,其原理在於通過不斷切分乙個規則排序,對半的去尋找目標元素所在的區間與位置。但是其有乙個前提,那就是資料結構需要是順序儲存結構,並且關鍵字大小有序排列。例子如下 例 有乙個數列 12,23,45,56,67,89 請使用二分查詢找到56的位置 解 首先mid 0 5 2...