问题引入
分治法三原则
- 原问题可以分解为若干个规模比较小的相同子问题
- 子问题互相独立
- 子问题的解可以合并为原问题的解
分治法基本解题流程
二分查找算法(折半查找)故事
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ff89aecac3b6aa9a10a163dbd0c6b132.png)
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
struct Data{
int flag;
};
bool compare(struct Data a,struct Data b){
return a.flag<b.flag;
}
int BinarySearch(int size,struct Data *list,int flag){
int low=0,high=size-1;
while(low<=high){
int middle=(low+high)/2;
if(list[middle].flag==flag){
return middle;
}else if(flag<list[middle].flag){
high=middle-1;
}else{
low=middle+1;
}
}
return -1;
}
int recursionBS(int low,int high,struct Data*list,int flag){
if(low>high){
return -1;
}
int middle=(low+high)/2;
if(list[middle].flag==flag){
return middle;
}else if(flag<list[middle].flag){
return recursionBS(low,middle-1,list,flag);
}else{
return recursionBS(middle+1,high,list,flag);
}
}
int main(int argc,char**argv){
struct Data list[10]={{12},{32},{423},{54},{65},{42},{65},{34},{12},{76}};
sort(list,list+10,compare);
cout<<"list flag:\n\t[";
for(int i=0;i<10;i++){
cout<<list[i].flag;
if(i==9){
cout<<"]\n";
}else{
cout<<",";
}
}
cout<<"("<<12<<",";
cout<<BinarySearch(10,list,12)<<",";
cout<<recursionBS(0,10-1,list,12)<<")"<<endl;
cout<<"("<<423<<",";
cout<<BinarySearch(10,list,423)<<",";
cout<<recursionBS(0,10-1,list,423)<<")"<<endl;
cout<<"("<<65<<",";
cout<<BinarySearch(10,list,65)<<",";
cout<<recursionBS(0,10-1,list,65)<<")"<<endl;
cout<<"("<<43<<",";
cout<<BinarySearch(10,list,43)<<",";
cout<<recursionBS(0,10-1,list,43)<<")"<<endl;
return 0;
}
程序输出
list flag:
[12,12,32,34,42,54,65,65,76,423]
(12,1,1)
(423,9,9)
(65,7,7)
(43,-1,-1)
--------------------------------
Process exited after 0.177 seconds with return value 0
请按任意键继续. . .