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

分治法:

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

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


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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值