剛才看到五大常用演算法之一的分治法,分治法有分而治之的思想,把規模不斷的縮小,這樣就會用到遞迴。二分查詢也是分治法的一種實現。
在二分查詢演算法的兩種實現方式中,就有乙個是遞迴的實現方式,另一種就是迴圈的實現方式。
二分查詢演算法實現的前提:已排序的陣列。
二分查詢(折半查詢)演算法原理:將已排好序的陣列,取出最小值的下標(即第乙個值)和最大值的下標(即陣列中的最後乙個值)。根據這兩個值得到陣列的中間值的下標已經所對應的中間值,並根據這個中間值與需要查詢的數進行判斷大小。如果相等,就直接輸出該值。如果中間值小於需要查詢的數,讓迴圈實現或者遞迴實現的最小值範圍變為中間值+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...