二分法查找算法
二分法查找索引值
二分法查找算法步驟:(前提:查詢數組為一組有序數)例題解析:
查找5的索引值
sum = {1,2,3,4,5,6,7,8,9,10}
代碼的非遞歸實現:
/*** 非遞歸方法* 時間復雜度T(n)=O(n)* 空間復雜度S(n)=O(1)* @return*/public static int search(int [] arr,int key){//定義low與high的值int low=0;int high=arr.length-1;//利用折半查找查找索引值while(low <= high){//確定mid的值int mid=(low+high)>>1;if(key==arr[mid])return mid;else if(key<arr[mid])high=mid-1;elselow=mid+1;}return -1;}二分查找易錯的地方
循環退出的條件
注意是low <= high,而不是low<high.
mid的取值
如果寫成 mid (low+high)/2是有問題,如果low和high比較大,兩者的和可能會溢出改進的方案low+(high-low)/2,但是計算機位運算比除法快,故可改成low+((high-low)>>1)
代碼的遞歸實現:
/*** 遞歸方法* 時間復雜度T(n)=O(log2(n))* 空間復雜度S(n)=O(log2(n))*/public static int search1(int arr[],int key){//定義low與high的值int low=0;int high=arr.length-1;return sreach(arr,key,low,high);}public static int sreach(int arr[],int key,int low,int high){int mid=(low+high)/2;if(key==arr[mid])return mid;if(low>high)return -1;else if(key<arr[mid])return sreach(arr,key,low,mid-1);elsereturn sreach(arr,key,mid+1,high);}總結
- 上一篇: 基于Python的应用程序的虚拟环境
- 下一篇: 面试官:如何实现 List 集合去重?