码迷,mamicode.com
首页 > 其他好文 > 详细

分治法

时间:2016-09-05 23:36:48      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:

 

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。

分治法所能解决的问题一般具有以下几个特征:
  1) 该问题的规模缩小到一定的程度就可以容易地解决
  2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
  3) 利用该问题分解出的子问题的解可以合并为该问题的解;
  4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

分治法的基本步骤:
分治法在每一层递归上都有三个步骤:
  分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
  解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
  合并:将各个子问题的解合并为原问题的解。

1>二分查找/折半查找
2>归并排序
3>汉诺塔
4>棋盘策略
5>快速排序
6>循环赛

那么开始吧,折半查找:

 

#include <iostream>
using namespace std;
//二分查找,折半查找

int mid_search(int s[], int left, int right,int find) {  //s[]存放所有待查询的数据
	                                                     // left左边界,right右边界
	int mid = (left + right) / 2;                        //find要查询的数
	for (; left <= right;) {
		if (find < s[mid]) {         //范围缩小到左半区
			right = mid - 1;
		}
		else if (find == s[mid]) {    //找到,递归不再向下
			return mid;
		}
		else {                      //范围缩小到右半区
			left = mid + 1;
		}
		mid = (left + right) / 2;
	}
	if (left >= right) {
		cout << "没有找到!" << endl;
		return -1;
	}

}

int main()
{
	while (1) {
		int s[100], k, j;
		cout << "请输入所有可以查询的数字(-1代表结束):" << endl;  //要按数字大小输入
		cin >> k;
		j = 0;
		while (k != -1) {
			s[j++] = k;
			cin >> k;
		}
		cout << "输入要查询的数字:" << endl;
		int i, m;
		cin >> i;

		m = mid_search(s, 0, j - 1, i);
		if (m != -1) {
			cout << "是左边起第" << m << "个数字(从0开始)" << endl;
		}
		system("pause");
	}
	return 0;
}

  上传图片中。。

归并排序:

 

分治法

标签:

原文地址:http://www.cnblogs.com/aimojun/p/5843981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!