算法:二分搜索法
阿新 • • 發佈:2019-04-28
一次 最簡 out static 指針 固定 void println 查詢
~非遞歸實現~
目錄
@(二分搜索法)
例如:
int a[]= {1,2,3,4,5,6,7,8};
一個數組,我們要從中找到5在其中的位置,最簡單就是如下:
for(int i=0;i<a.length;i++){
if(a[i]==5){
return i;
}
}
這種方法用大O表達法分析[^1]的話,
i=0;的頻度為1
i<a.length的頻度為n; ==a.length的長度不是固定的==
if語句也執行了n次
時間復雜度為:
T(n)= 1+ 2*n;
可以寫為T(n)=O(n)
使用二分搜索法的話:
public static void main(String[] args) { // TODO Auto-generated method stub int a[]= {1,2,3,4,5,6,7,8}; System.out.println(binarySearch(a, 7)); System.out.println(binarySearchp(a, 7,0,a.length-1)); } /** * 非遞歸 * @param a 需要查詢的數組 * @param x 需要查詢的值 * @return 數組中的索引 */ public static int binarySearch(int a[],int x) { int l=0,r=a.length-1; while(l<=r) { int m=(l+r)/2; if(a[m]==x) { return m; }else if(a[m]>x) { r=m-1; }else { l=m+1; } } return -1; }
~遞歸實現~
/** * 遞歸 * @param a 數組 * @param x 需要查詢的值 * @param l 左邊的指針 * @param r 右邊的指針 * @return 在數組中的索引 */ public static int binarySearchp(int a[],int x,int l,int r) { int m=(l+r)/2; int res=0; if(a[m]==x) { return m; }else if(a[m]>x) { return binarySearchp(a, x,l,m-1); }else { return binarySearchp(a, x,m+1,r); } } public static void main(String[] args) { // TODO Auto-generated method stub int a[]= {1,2,3,4,5,6,7,8}; System.out.println(binarySearch(a, 7)); System.out.println(binarySearchp(a, 7,0,a.length-1)); }
==用大O分析二分搜索的算法,可見每次執行一次算法的while循環,搜索數組減少一半,因此最壞情況被執行了O(logn)==
[^1]:大O表示法主要用來
計算算法的時間復雜度
算法:二分搜索法