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;
}