首页 > 代码库 > 二分查找(折半查找)
二分查找(折半查找)
递归实现:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 int a[100]={1,2,3,5,12,12,12,15,29,55};//数组中的数(由小到大) 9 int k;//要找的数字 10 int found(int x,int y) 11 { 12 int m=x+(y-x)/2; 13 if(x>y)//查找完毕没有找到答案,返回-1 14 return -1; 15 else 16 { 17 if(a[m]==k) 18 return m;//找到!返回位置. 19 else if(a[m]>k) 20 return found(x,m-1);//找左边 21 else 22 return found(m+1,y);//找右边 23 } 24 } 25 int main() 26 { 27 cin>>k;//输入要找的数字c语言把cin换为scanf即可 28 cout<<found(0,9);//从数组a[0]到a[9]c语言把cout换为printf即可 29 return 0; 30 }
1 int binSearch(const int *Array,int start,int end,int key) 2 { 3 int left,right; 4 int mid; 5 left=start; 6 right=end; 7 while(left<=right) 8 9 { 10 mid=(left+right)/2; 11 if(key==Array[mid]) return mid; 12 else if(key<Array[mid]) right=mid-1; 13 else if(key>Array[mid]) left=mid+1; 14 15 } 16 return -1; 17 }
1 int bsearchWithoutRecursion(int array[],int low,int high,int target) 2 { 3 //这个函数有问题, 4 //1)若查找的target在high处; 5 //2)若查找的数大于array数值中最大值,也会出问题; 6 while(low<=high) 7 { 8 int mid=(low+high)/2; 9 if(array[mid]>target) 10 high=mid-1; 11 elseif(array[mid]<target) 12 low=mid+1; 13 else 14 return mid; 15 } 16 return-1; 17 }
1 int BinSearch(SeqList *R,int n,KeyType K) 2 { 3 //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1 4 int low=0,high=n-1,mid;//置当前查找区间上、下界的初值 5 while(low<=high) 6 { 7 if(R[low].key==K) 8 return low; 9 if(R[high].key==k) 10 return high; //当前查找区间R[low..high]非空 11 mid=low+((high-low)/2); 12 /*使用(low+high)/2会有整数溢出的问题 13 (问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时, 14 这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2) 15 不存在这个问题*/ 16 if(R[mid].key==K) 17 return mid;//查找成功返回 18 if(R[mid].key<K) 19 low=mid+1;//继续在R[mid+1..high]中查找 20 else 21 high=mid-1;//继续在R[low..mid-1]中查找 22 } 23 if(low>high) 24 return -1;//当low>high时表示所查找区间内没有结果,查找失败 25 }
We basically ignore half of the elements just after one comparison.
1) Compare x with the middle element.
2) If x matches with middle element, we return the mid index.
3) Else If x is greater than the mid element, then x can only lie in right half subarray after the mid element. So we recur for right half.
4) Else (x is smaller) recur for the left half.
Following is Recursive implementation of Binary Search.
http://quiz.geeksforgeeks.org/binary-search/
1 int binarysearch(int *arr, int s, int e, int key){ 2 while (s <= e) { 3 int mid = (s+e)/2; 4 if(key < arr[mid]){ 5 e = mid -1; 6 }else if (key > arr[mid]) { 7 s = mid + 1; 8 }else { 9 return mid; 10 } 11 } 12 return -1; 13 } 14 15 int binarySearch(int arr[], int l, int r, int x) 16 { 17 if (r >= l) 18 { 19 int mid = l + (r - l)/2; 20 21 // If the element is present at the middle itself 22 if (arr[mid] == x) return mid; 23 24 // If element is smaller than mid, then it can only be present 25 // in left subarray 26 if (arr[mid] > x) return binarySearch(arr, l, mid-1, x); 27 28 // Else the element can only be present in right subarray 29 return binarySearch(arr, mid+1, r, x); 30 } 31 32 // We reach here when element is not present in array 33 return -1; 34 }
- ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
- ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。
1 // lower_bound/upper_bound example 2 #include <iostream> // std::cout 3 #include <algorithm> // std::lower_bound, std::upper_bound, std::sort 4 #include <vector> // std::vector 5 6 int main () { 7 int myints[] = {10,20,30,30,20,10,10,20}; 8 std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20 9 10 std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30 11 12 std::vector<int>::iterator low,up; 13 low=std::lower_bound (v.begin(), v.end(), 20); // ^ 14 up= std::upper_bound (v.begin(), v.end(), 20); // ^ 15 16 std::cout << "lower_bound at position " << (low- v.begin()) << ‘\n‘; 17 std::cout << "upper_bound at position " << (up - v.begin()) << ‘\n‘; 18 19 return 0; 20 }
二分查找(折半查找)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。