分治法的基本思想是将一个规模为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; }
上传图片中。。
归并排序:
时间: 2024-10-22 22:30:57