一、二分查找算法思想
三、二分查找優缺點
優點是比較次數少,查找速度快,平均性能好;
其缺點是要求待查表爲有序表,且插入刪除困難。
因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
使用條件:查找序列是順序結構,有序。
四、代碼實現
1.非遞歸方法
private static int binarySearch(int[] arr, int key) {
int left = 0;
int right = arr.length-1;
int mid ;
if (key < arr[left] || key > arr[right] || left > right){
return -1;
}
while(left < right){
mid = (left + right)/2;
if (arr[mid] < key){
left = mid +1;
}else if(arr[mid] > key){
right = mid - 1;
}else {
return mid ;
}
}
return -1;
}
2.遞歸方法
public static int binarySearch(int[] arr,int left,int right,int key){
if (key < arr[left] || key > arr[right] || left > right){
return -1;
}
int mid = (left+right)/2;
if (arr[mid]<key){
return binarySearch(arr,mid+1,right,key);
}else if(arr[mid]>key){
return binarySearch(arr,left,mid-1,key);
}else {
return mid;
}
}
五、時間複雜度和空間複雜度
時間複雜度
採用的是分治策略
最壞的情況下兩種方式時間複雜度一樣:O(log2 N)
最好情況下爲O(1)
空間複雜度
算法的空間複雜度並不是計算實際佔用的空間,而是計算整個算法的輔助空間單元的個數
非遞歸方式:由於輔助空間是常數級別的,所以空間複雜度是O(1);
遞歸方式: 遞歸的次數和深度都是log2 N,每次所需要的輔助空間都是常數級別的:
空間複雜度:O(log2N )