归并排序也就是把一个数列分成两份,首先分别对2份进行排序,然后把这2份一起排序,典型的递归实现.
实现代码: MergeSort.h:
//归并排序时间复杂度:NlogN,但是由于存在
// for(int i=0;i!=length;++i)
// *first++=*(assistSpace+i);
//数据的复制需要额外的时间,减慢了排序的速度。
#ifndef ___MERGE_SORT_H
#define ___MERGE_SORT_H
namespace zk_sima
{
template<typename Iterator ,typename Object>
void Merge(Iterator first,Iterator middle,Iterator last,Object)
{
int length=last-first;
if(length<0)
return ;
Object* assistSpace=(Object*)calloc(length,sizeof(Object));
Object* pPoint=assistSpace;
Iterator _first=first,_middle=middle;
while(_first!=middle&&_middle!=last)
{
if(*_first<*_middle)
*pPoint++=*_first++;
else
*pPoint++=*_middle++;
}
if(_first==middle)
{
while(_middle!=last)
*pPoint++=*_middle++;
}
else
while(_first!=middle)
*pPoint++=*_first++;
for(int i=0;i!=length;++i)
*first++=*(assistSpace+i);
free(assistSpace);
assistSpace=0;
}
template<typename Iterator>
void MergeSort(Iterator first,Iterator last)
{
Iterator middle=first+(last-first)/2;
if(first+1<middle)
MergeSort(first,middle);
if(middle+1<last)
MergeSort(middle,last);
Merge(first,middle,last,*first);
}
}
#endif