图解:归并选择.缺点,需要双倍数据内存,因为有个临时变量.
函数:
两列排好序的数据 归并为一列,这边称为归并数,图中每两个红箭头归并为一个归并次数 共有9个归并次数,两次复制
void Merge(T *initList,T *mergeList, const int l ,const int m, const int n)
整一列归并到下一列过程 归并过程涵盖归并和复制
void MergePass(T *initList, T *resultList, const int n, const int s)
整个归并函数
void MergeSort(T *a, const int n)
//归并排序
//[0, 2,3,5,5,16, 10,20,20,48]
// l=1, m=5 n=9
// {0,23,47,81,95,7,14,39,55,62,74};
//l = 1 m = 4 n = 10
//原始数组 结果数组 后面三个参数见上示例
template <class T>
void Merge(T *initList,T *mergeList, const int l ,const int m, const int n)
{
int i1, i2, iResult;
for(i1 = l , i2 = m+1 , iResult = l; i1<=m && i2 <=n; iResult ++)
{
if(initList[i1] <= initList [i2] )
{
mergeList[iResult] = initList[i1];
i1++;
}
else
{
mergeList[iResult] = initList[i2];
i2++;
}
}
copy(initList+i1,initList+m+1,mergeList+iResult);//注意 M N 加一
copy(initList+i2,initList+n+1,mergeList+iResult);
}
//n 是数据个数 s是归并单位数据个数
template <class T>
void MergePass(T *initList, T *resultList, const int n, const int s)
{
int i ;
//s = 1 n = 10 i = 1; i <= 9; i+=2 1 3 5 7 9 1 1 2 五次归并
//s = 2 n = 10 i = 1; i <= 7; i+=4 1 5
for(i = 1; i <= n-2*s+1 ; i+=2*s)
Merge(initList,resultList,i,i+s-1,i+2*s-1);
if((i+s-1)<n) // 右图三行iiii ii合并为四行iiiiii i i i i i i
Merge(initList,resultList,i,i+s-1,n); ii ii ii
else //图示复制情况 右图二行ii到三行ii iiii ii
copy(initList+i,initList+n+1,resultList+i); iiiiii
}
template <class T>
void MergeSort(T *a, const int n)
{
T *tempList = new int [n+1];
for (int i = 1; i < n; i*=2)
{
MergePass(a,tempList,n,i); //目的 临时数组和储存数组交换使用 节省空间 而且保证每次处理完数据不存在临时数组
i *= 2;
MergePass(tempList,a,n,i);
}
delete[](tempList);
}
MAIN函数内容 //第一个存储空间m[0]不用 为了加快循环速度 从而加快算法速度
int m[] ={0,26,5,77,1,61,11,59,15,48,19,12,13,45,26};
//int n[11] = {0};
//MergePass(m,n,10,1);
MergeSort(m,14);
for (int i = 1; i < 15; ++i)
{
cout <<m[i] <<" ";
}
return 0;