#include <vector>
using namespace std;
template <typename Comparable>
void mergeSort(vector<Comparable> & a)
{
vector<Comparable> tmpArray(a.size()); //存放归并结果的数组
mergeSort(a,tmpArray,0,a.size()-1); //子数组的最左和最右下标
}
template <typename Comparable>
void mergeSort(vector<Comparable> & a,vector<Comparable> & tmpArray,int left,int right)
{
if (left<right)
{
int center=(left+right)/2;
mergeSort(a,tmpArray, left, center);
mergeSort(a, tmpArray, center+1, right);
merge(a,tmpArray,left,center+1,right);
}
}
template <typename Comparable>
void merge(vector<Comparable> & a,vector<Comparable> & tmpArray,
int leftPos,int rightPos,int rightEnd)
{
int leftEnd=rightPos-1;
int tmpPos=leftPos;
int numElements=rightEnd-leftPos+1;
//将两数组中的较小者放入临时数组
while (leftPos<=leftEnd&&rightPos<=rightEnd)
{
if (a[leftPos]<=a[rightPos])
tmpArray[tmpPos++]=std::move(a[leftPos++]);
else
tmpArray[tmpPos++]=std::move(a[rightPos++]);
}
//一个数组用完了,则将另一个数组的剩余部分全部放入临时数组
while(leftPos<=leftEnd)
tmpArray[tmpPos++]=std::move(a[leftPos++]);
while(rightPos<=rightEnd)
tmpArray[tmpPos++]=std::move(a[rightPos++]);
//将临时数组复制回原始数组
for(int i=0;i<numElements;++i,--rightEnd)
a[rightEnd]=std::move(tmpArray[rightEnd]);
}
归并排序
最新推荐文章于 2023-09-03 20:36:33 发布