分治法-二分搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治法-二分搜索相关的知识,希望对你有一定的参考价值。

算法复杂度为while循环的个数

缺点是待查表为有序表

 1 #include <iostream>
 2 
 3 using namespace std;
 4 int binary_search(int *a,int len,int target);
 5 int main()
 6 {
 7     size_t LEN=5000;
 8     int a[LEN],target,index;
 9     for(size_t i=0; i<LEN; i++)
10         a[i]=i-2500;           //升序排列
11     cin>>target;
12     index=binary_search(a,LEN,target);
13     if(index!=-1)
14         cout<<"数组下标为"<<index<<endl;
15     else
16         cout<<"没有找到"<<endl;
17     return 0;
18 }
19 int binary_search(int *a,int len,int target)
20 {
21     int low,mid,heigh;
22     low=0;
23     heigh=len-1;
24     mid=len/2;
25     while(low<=heigh)
26     {
27         if(a[mid]==target)
28             return mid;
29         if(a[mid]>target)
30             heigh=mid-1;
31         if(a[mid]<target)
32             low=mid+1;
33         mid=low+(heigh-low)/2;
34     }
35     return -1;
36 }

 

也可以用递归的

 1 #include <iostream>
 2 
 3 using namespace std;
 4 int binary_search(int *a,int low,int mid,int heigh,int target);
 5 int main()
 6 {
 7     size_t LEN=5000;
 8     int a[LEN],target,index;
 9     for(size_t i=0;i<LEN;i++)
10         a[i]=i-2500;           //升序排列
11     cin>>target;
12     index=binary_search(a,0,LEN/2,LEN-1,target);
13     if(index!=-1)
14     cout<<"数组下标为"<<index<<endl;
15     else
16         cout<<"没有找到"<<endl;
17     return 0;
18 }
19 int binary_search(int *a,int low,int mid,int heigh,int target)
20 {
21     if(low>heigh)
22         return -1;
23     if(a[mid]==target)
24         return mid;
25     else if(a[mid]>target)
26     return binary_search(a,low,low+(mid-1-low)/2,mid-1,target);
27     else if(a[mid]<target)
28     return binary_search(a,mid+1,mid+1+(heigh-mid-1)/2,heigh,target);
29 }

 

望多多指教

以上是关于分治法-二分搜索的主要内容,如果未能解决你的问题,请参考以下文章

二分搜索法

算法第二章上机实践报告

分治算法-二分查找

算法复习_分治算法之二分搜索棋盘覆盖快速排序

A - Superset CodeForces - 97B(人生第一个分治法,感觉,像二分啊。。)

分治法之二分查找