分治法:
分:递归解决较小的问题
治:然后从子问题的解构建原问题的解
分治算法核心思想:从上往下分析问题,大问题可以分解为子问题,子问题中还有更小的子问题,先解决小问题,合并小问题的解从而得到原问题的解。
例题1:在一个排序好的数组中,找一个给定的值
/解决方法:
先判断中间的数据与要查找的数据,之后根据在通过递归将问题缩小,根据大小判断在中间数据的左侧查找还是在右侧查找。/
#include<stdio.h>
#include<Windeos.h>
int BinSearch(int arry[],int key,int left,int right);
int main() {
int arry[10] = {1,2,3,4,5,6,7,8,9,10};
int index = -1;
index = BinSearch(arry, 5, 0, 9);
printf("%d\n",index);
system("pause");
return 0;
}
int BinSearch(int arry[], int key, int left, int right) {
int mid = (left + right) / 2;//求出中间值
if (left > right) {
//如果左边边界大于右边边界,说明数组已经找完.
return -1;
}
if (arry[mid] < key) {
//如果key大于中间值,去数组右边查找,即数组左边从mid+1开始
return BinSearch(arry,key,mid+1,right);
}
else if (arry[mid] > key) {
//如果key小于中间值,去数组左边查找,即数组右边从mid-1开始
return BinSearch(arry, key, left, mid - 1);
}
else {
//如果找到了,返回值下标
return mid;
}
}
例题2:如果一个人一次可以上 1 级台阶,也可以一次上 2 级台阶。求这个人走一个 n 级台阶总共有多少种走法?
解决方法:通过分治算法思想可以知道要先将问题分解成
小问题,就是先判断n-1步(最后一步走了一个台阶)和n-2步(最后一步走了两个台阶)走了多少台阶台阶,在将这个两个问题分解成更小的问题,进行解决,直到最后剩下一步和两步的时候,给出解决方案。
#include<stdio.h>
#include<Windows.h>
int Walkcount(int n);
int main() {
int n;
printf("请输入台阶数:");
scanf_s("%d",&n);
printf("台阶个数为%d个\n",Walkcount(n));
system("pause");
return 0;
}
int Walkcount(int n){
if (n <= 0) return 0;
if (n == 1) {
return 1;
}else if (n == 2) {
return 2;
}
else {
return Walkcount(n - 1) + Walkcount(n - 2);
}
}