改进后的归并排序算法:
//////////////////////////////////////////////////////
//递归:MergeSortImprove()全局函数
//改进后的归并排序的算法,先划分子序列,在对各个自序列
//递归排序,再把子序列合并,如果子序列的长度短于M(指定)
//就递归返回,对已经基本有序的序列再进行一次直接插入排序
//L是待排序的序列,L2是排序所需要的辅助数组
//////////////////////////////////////////////////////
template<class T,class E>
void MergeSortImprove(DataSortList<T,E>& L
,DataSortList<T,E>& L2,int left,int right)
{
if(right-left+1<3) //如果子序列的长度小于指定的M
return; //就退出递归
int mid=(left+right)/2; //划分子区间
MergeSortImprove(L,L2,left,mid); //递归对左子序列排序
MergeSortImprove(L,L2,mid+1,right);//递归对右子序列排序
MergeImprove(L,L2,left,mid,right); //再把两个子序列归并
};
////////////////////////////MergeSortImprove()函数结束
//////////////////////////////////////////////////////
//DoSort()全局函数
//对已经进行过的归并排序后剩下的基本有序的序列再
//进行最后一次直接插入排序(因为已经基本有序,所以
//最后的直接插入排序的时间复杂度将很低)
//////////////////////////////////////////////////////
template<class T,class E>
void DoSort(DataSortList<T,E>& L,DataSortList<T,E>& L2,
int left,int right)
{
//先对待排序的序列进行一次归并排序
MergeSortImprove(L,L2,left,right);
//再对已经基本有序的序列进行一次直接插入排序
L.InsertSort(left,right);
};
//////////////////////////////////////DoSort()函数结束
#endif
//////////////////////////////////////////////////////
//递归:MergeSortImprove()全局函数
//改进后的归并排序的算法,先划分子序列,在对各个自序列
//递归排序,再把子序列合并,如果子序列的长度短于M(指定)
//就递归返回,对已经基本有序的序列再进行一次直接插入排序
//L是待排序的序列,L2是排序所需要的辅助数组
//////////////////////////////////////////////////////
template<class T,class E>
void MergeSortImprove(DataSortList<T,E>& L
,DataSortList<T,E>& L2,int left,int right)
{
if(right-left+1<3) //如果子序列的长度小于指定的M
return; //就退出递归
int mid=(left+right)/2; //划分子区间
MergeSortImprove(L,L2,left,mid); //递归对左子序列排序
MergeSortImprove(L,L2,mid+1,right);//递归对右子序列排序
MergeImprove(L,L2,left,mid,right); //再把两个子序列归并
};
////////////////////////////MergeSortImprove()函数结束
//////////////////////////////////////////////////////
//DoSort()全局函数
//对已经进行过的归并排序后剩下的基本有序的序列再
//进行最后一次直接插入排序(因为已经基本有序,所以
//最后的直接插入排序的时间复杂度将很低)
//////////////////////////////////////////////////////
template<class T,class E>
void DoSort(DataSortList<T,E>& L,DataSortList<T,E>& L2,
int left,int right)
{
//先对待排序的序列进行一次归并排序
MergeSortImprove(L,L2,left,right);
//再对已经基本有序的序列进行一次直接插入排序
L.InsertSort(left,right);
};
//////////////////////////////////////DoSort()函数结束
#endif