C++实现归并排序算法

1.归并排序 实现方法:

     把长度为 n 的数列,每次简化为两个长度为 n/2 的数列,直至数列中剩一个元素后两两合并,直至所有都参与操作。

    合并方法:比较两个数列第一个元素,将最小的放在另一个数中C中,重复直至某数列为空,然后将另一个数列中元素都放入C数组中

2.代码实现:

#include <iostream>
#include <vector>

using namespace std;

// 拷贝数组函数
// 将数组SourceData的第BeginIndex个元素~第EndIndex个元素拷贝到另一个数组中,并返回
template <class T>
vector<T> CopyVectorData(vector<T> &SourceData, int BeginIndex, int EndIndex)
{
	vector<T> tempVec;
	
	for (int i = BeginIndex; i <= EndIndex; ++i)
	{
		tempVec.push_back(SourceData[i]);
	}
	return tempVec;
}

// 合并函数
// 将两个数组中的元素按照从小到大的形式放到另一个数组中,并返回
template <class T>
vector<T> Merge(vector<T> &LeftData, vector<T> &RightData)
{
	size_t leftIndex = 0;
	size_t rightIndex = 0;
	vector<T> resultData;

	while( (leftIndex < LeftData.size()) && (rightIndex < RightData.size()))
	{
		if ( LeftData[leftIndex] <= RightData[rightIndex])
		{
			resultData.push_back(LeftData[leftIndex]);
			++leftIndex;
		}
		else
		{
			resultData.push_back(RightData[rightIndex]);
			++rightIndex;
		}
	}
	
	while(leftIndex < LeftData.size())
	{
		resultData.push_back(LeftData[leftIndex]);
		++leftIndex;
	}
	while(rightIndex < RightData.size())
	{
		resultData.push_back(RightData[rightIndex]);
		++rightIndex;
	}
	return resultData;
}

// 归并排序 算法
template <class T>
vector<T> MergeSort(vector<T> &SortData)
{
	if (SortData.size() == 1)
	{
		return SortData;
	}
	vector<T> leftData = CopyVectorData(SortData, 0, SortData.size()/2 - 1);
	vector<T> rightData = CopyVectorData(SortData, SortData.size()/2, SortData.size()-1);

	vector<T> resultData = Merge(MergeSort(leftData), MergeSort(rightData));

	return resultData;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int ia[] = {12, 20, 5, 10, 34, 49, 33, 88, 42, 12};	
	vector<int> Select(ia, ia+10);

	vector<int> Result = MergeSort(Select);

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LearnLHC/article/details/85164047