版权声明:如有帮助,赞一个可好。邮箱:[email protected] https://blog.csdn.net/qq_40946921/article/details/89218183
4-5:设计分治算法求一个数组的最大元素:
//Ex4_5
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
template<typename T>
T getMax(vector<T> &vc, int begin, int size){
return size == 1 ? vc[begin] : max(getMax(vc, begin, size / 2), getMax(vc, begin + size / 2, size - size / 2));
}
int main() {
vector<double> a = { 1,9,20,12.3,8,9.4,13,35.1 };
cout <<"数组a最大值为:"<< getMax(a, 0, a.size()) << endl;
vector<int> b = { 1,3,5,8,4,2,6,5,12,8 };
cout << "数组b的最大值为:" << getMax(b, 0, b.size());
return 0;
}
4-6:设计分治算法,实现数组循环左移k个位置:
//Ex4_6
#include<iostream>
#include<vector>
#include<string>
using namespace std;
template<class T>
T move(T &type,int k) {
k %= type.size();
reverse(type.begin(), type.begin() + k);
reverse(type.begin() + k, type.end());
reverse(type.begin(), type.end());
return type;
}
int main(){
vector<int> vc = { 1,2,3,4,5,6,7,8,9 };
string str = "abcdefgh";
move(vc, 4);
move(str, 4);
cout << "数组左移4:";
for (auto&it : vc)
cout << it;
cout << endl;
cout << "字符串左移4:" << str;
return 0;
}
4-7: 设计分治算法求n个元素的全排列:
//Ex4_7
#include <string>
#include <iostream>
#include<vector>
using namespace std;
template <class T>
void fullperm(T &t, int k) {
if (k == t.size()) {
for (int i = 0; i < t.size(); ++i)
cout << t[i] << " ";
cout << endl;
}
for (int i = k; i < t.size(); ++i) {
swap(t[k], t[i]);
fullperm(t, k + 1);
swap(t[k], t[i]); //回溯
}
}
int main(){
string str = "abc";
fullperm(str, 0);
vector<int> arr = { 1,2,3,4 };
fullperm(arr, 0);
return 0;
}
4-9:设计分治算法,在有序序列中(r1,r2,...,rN)中寻找 使得 ri=i 的元素 i = [1 ,n ]:
//Ex4_9
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int find(vector<int> &vc, int begin, int end) {
if (begin + 1 == end )
return begin+1 == vc[begin] ? begin : -1;
else if (vc[begin] <= begin - 1 || vc[end - 1] >= end) //划分
return max(find(vc, begin, begin + (end - begin) / 2), find(vc, begin + (end - begin) / 2, end));
else return -1;
}
int main() {
vector<int> vc={0,1,3,9,10,14};
int index = find(vc, 0, vc.size());
if (index != -1) //bug:只能找到最大的那个元素,需要全部找出要通过数组存储
cout << "这个元素在第" << index + 1 << "个位置,值为:" << vc[index];
else
cout << "未找到这样的元素!" << endl;
return 0;
}
4-11:设M是一个nXn的有序整数矩阵,每一行(从左到右)和每一列(从上到下)都是按升序排序,先给定一个整数x,判断x是否在M中,使用分治求解:
//Ex4_11
#include<iostream>
using namespace std;
const int MAX = 100;
int n = 4;
int rowfind(int a[], int begin, int size, int key) { //在行中查找元素
if (size == 1)
return a[begin] == key;
else if (key >= a[begin] && key <= a[begin + size - 1])
return rowfind(a, begin, begin + size / 2, key) || rowfind(a, begin + size / 2, size - size / 2, key);
else return 0;
}
int find(int a[][MAX],int begin,int size,int key) { //在矩阵中查找元素可能所在行
if (size == 1)
return rowfind(a[begin], 0, n, key);
else if (key >= a[begin][0] && key <= a[begin + size - 1][n - 1])
return find(a, begin, begin + size / 2, key) || find(a, begin + size / 2, size - size / 2, key);
else return 0;
}
int main() {
int num[MAX][MAX] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };
int key = 17;
cout << (find(num, 0, n, key) ? "找到" : "未找到") << key << endl;
key = 14;
cout << (find(num, 0, n, key) ? "找到" : "未找到") << key << endl;
return 0;
}