[C++]泛型归并排序及泛型二分查找

排序算法时间复杂度

在这里插入图片描述
常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

支持STL的泛型归并排序

1.我们先建立一个头文件 algorithm_sort.h 下面是内容

#include <vector>

template <class Iterator, class Strategy>
inline void MergeSort(Iterator _First, Iterator _Last,
	Strategy _Strategy)
{
	if (_First == _Last || _Last - _First == 1)
		return;
	typedef iterator_traits<Iterator>::difference_type difference_type;
	difference_type differenceType = (_Last - _First) / 2;
	MergeSort(_First, _First + differenceType, _Strategy);
	MergeSort(_First + differenceType, _Last, _Strategy);
	_merge(_First, _First + differenceType, _First + differenceType, _Last, _Strategy);
}

template <class Iterator, class Strategy>
inline void _merge(Iterator _Part1First, Iterator _Part1Last,
	Iterator _Part2First, Iterator _Part2Last,
	Strategy _Strategy)
{
	Iterator itPart1 = _Part1First;
	Iterator itPart2 = _Part2First;

	typedef iterator_traits<Iterator>::value_type value_type;
	vector<value_type> result;

	while (itPart1 != _Part1Last && itPart2 != _Part2Last){
		if (_Strategy(*itPart1, *itPart2)){
			result.push_back(*itPart1);
			itPart1++;
		}
		else{
			result.push_back(*itPart2);
			itPart2++;
		}
	}

	if (itPart1 < _Part1Last)
		result.insert(result.end(), itPart1, _Part1Last);
	if (itPart2 < _Part2Last)
		result.insert(result.end(), itPart2, _Part2Last);

	itPart1 = _Part1First;
	itPart2 = _Part2First;
	vector<value_type>::iterator it = result.begin();
	while (it != result.end()){
		if (itPart1 != _Part1Last){
			*itPart1 = *it;
			itPart1++;
		}
		else if (itPart2 != _Part2Last){
			*itPart2 = *it;
			itPart2++;
		}
		it++;
	}
}

2.下面是调用过程

#include "stdafx.h"
#include <iostream>
#include "algorithm_sort.h"
#include <stdlib.h>
using namespace std;
struct MyStruct
{
	int num;
	double age;
};

template<class T>
bool Max(T a, T b)//排序策略
{
	return a.num < b.num;
}

int _tmain(int argc, _TCHAR* argv[])
{
	MyStruct myStruct;
	myStruct.num = 12;
	myStruct.age = 1.;

	vector<MyStruct> data;
	data.push_back(myStruct);
	myStruct.num = 15;
	data.push_back(myStruct);
	myStruct.num = 9;
	data.push_back(myStruct);
	myStruct.num = 4;
	data.push_back(myStruct);
	myStruct.num = 7;
	data.push_back(myStruct);
	myStruct.num = 16;
	data.push_back(myStruct);
	//归并排序
	MergeSort(data.begin(), data.end(), Max<MyStruct>);
	for (size_t i = 0; i < data.size(); i++)
	{
		cout << data[i].num << ' ';
		cout << endl;
	}
}

3.输出结果
在这里插入图片描述

支持STL的泛型二分查找

1.我们先建立一个头文件 algorithm_search.h 下面是内容

template<class Iterator, class Strategy, class T>
inline Iterator BinarySearch(Iterator _First, Iterator _Last, Strategy _Strategy, const T& key)
{
	Iterator first = _First;
	Iterator end = _Last - 1;
	Iterator mid;
	while (first <= end)
	{
		mid = first + distance(first, end) / 2;
		if (_Strategy(*mid, key) > 0)
			end = mid - 1;
		else if (_Strategy(*mid, key) < 0)
			first = mid + 1;
		else
			return mid;
	}
	return _Last;
}

2.下面是调用过程,在原有归并排序的基础上扩充二分查找 。因为二分查找需要有序集合!

#include "stdafx.h"
#include <iostream>
#include "algorithm_sort.h"
#include <stdlib.h>
#include "algorithm_search.h"
using namespace std;
struct MyStruct
{
	int num;
	double age;
};

template<class T>
bool Max(T a, T b)//排序策略
{
	return a.num < b.num;
}

template<class T1, class T2>
int FindKey(T1 a, T2 b)//查找策略
{
	if (a.num < b)
		return -1;
	if (a.num > b)
		return 1;
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	MyStruct myStruct;
	myStruct.num = 12;
	myStruct.age = 1.;

	vector<MyStruct> data;
	data.push_back(myStruct);
	myStruct.num = 15;
	data.push_back(myStruct);
	myStruct.num = 9;
	data.push_back(myStruct);
	myStruct.num = 4;
	myStruct.age = 99;
	data.push_back(myStruct);
	myStruct.num = 7;
	myStruct.age = 1.;
	data.push_back(myStruct);
	myStruct.num = 16;
	data.push_back(myStruct);
	//归并排序
	MergeSort(data.begin(), data.end(), Max<MyStruct>);
	for (size_t i = 0; i < data.size(); i++)
	{
		cout << data[i].num << ' ';
		cout << endl;
	}
	//二分查找
	vector<MyStruct>::iterator it = BinarySearch(data.begin(), data.end(), FindKey<MyStruct, int>, 4);
	cout << it->age << ' ';
	system("PAUSE");
	return 0;
}

3.输出结果 找到了num是4的对象内age成员的值
在这里插入图片描述

Lambda表达式写法

这样写可以免去外置一个判别策略函数的麻烦

int _tmain(int argc, _TCHAR* argv[])
{
	MyStruct myStruct;
	myStruct.num = 12;
	myStruct.age = 1.;

	vector<MyStruct> data;
	data.push_back(myStruct);
	myStruct.num = 15;
	data.push_back(myStruct);
	myStruct.num = 9;
	data.push_back(myStruct);
	myStruct.num = 4;
	myStruct.age = 99;
	data.push_back(myStruct);
	myStruct.num = 7;
	myStruct.age = 1.;
	data.push_back(myStruct);
	myStruct.num = 16;
	data.push_back(myStruct);
	//归并排序
	//Lambda表达式写法
	MergeSort(data.begin(), data.end(), [](MyStruct a, MyStruct b) { return a.num < b.num; });
	
	for (size_t i = 0; i < data.size(); i++)
	{
		cout << data[i].num << ' ';
		cout << endl;
	}
	//二分查找
	//Lambda表达式写法
	vector<MyStruct>::iterator it = BinarySearch(data.begin(), data.end(), [](MyStruct mystruct, int num) 
	{
		if (mystruct.num < num)
			return -1;
		if (mystruct.num > num)
			return 1;
		return 0; 
	}, 4);
	cout << it->age << ' ';
	system("PAUSE");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38125278/article/details/88971212
今日推荐