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);
}
}