五大常规算法---分治法

分治法:

分:递归解决较小的问题
治:然后从子问题的解构建原问题的解

分治算法核心思想:从上往下分析问题,大问题可以分解为子问题,子问题中还有更小的子问题,先解决小问题,合并小问题的解从而得到原问题的解。


例题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);
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_49324123/article/details/115120373