java實現折半查找


package althorgrim;
/**
* 1、必須采用順序存儲結果
* 2、關鍵字必須有序
* @author hanrk-2734
*
*/
public class TestBinarySearch {


public static int binarySearch(int a[],int goal){
int high=a.length-1;
int low=0;
while (low<=high) {
int middle=(low+high)/2;
if (a[middle]==goal) {
return middle;
}
else if (a[middle]>goal) {
high=middle-1;
}
else {
low=middle+1;
}
}
return -1;


}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src, 3));
}

}
O(1):直接尋址到

O(n):遍歷n個元素

O(logn):隨着元素增加,呈現指數關系

O(n2):增加一倍元素,時間增加4倍

折半查找的算法時間復雜度最好的情況是O(1),平均情況下是logn。

分析一下,折半查找的算法時間復雜度為什么是logn?

算法的時間復雜度取決於運算時間,折半查詢中主要依賴while循環次數,那么while循環次數是多少?假設有16個元素的數組進行折半查詢,查詢元素13

如果是n個元素,那么就是:

可以得出 k=logn

 


public class Demo {

public static void main(String[] args) {
int[] array = new int[] {3,6,8,9,10,11,13,19,25};
//聲明角標 最小 和 最大 角標 和折半角標
int min=0;
int max=array.length-1;
int mid=(max+min)/2;
//聲明要查找的值
int key=13;
//循環查找 循環里肯定要折半的操作
//我現在已經 明確知道 循環什么時候停止
//使用 key 和 中間角標的值 比較 如果相等 循環停止

while(key!=array[mid]) {
if(key>array[mid]) {
min=mid+1;
}else if(key<array[max]){
max=mid-1;
}
//重復折半的操作
mid=(max+min)/2;

//如果數組中沒有這個數 會造成死循環
//需要一個出口讓程序停止
if(min>max) {

//這里說明 沒找到這個數 需要停止循環
mid=-1;
break;
}
}System.out.println("坐標是:"+mid);

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM