算法练习——分治

版权声明:如有帮助,赞一个可好。邮箱:[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;
}

猜你喜欢

转载自blog.csdn.net/qq_40946921/article/details/89218183