归并选择算法

图解:归并选择.缺点,需要双倍数据内存,因为有个临时变量.

函数:

两列排好序的数据 归并为一列,这边称为归并数,图中每两个红箭头归并为一个归并次数 共有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;

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值