2-路归并排序

假设初始序列含有n个记录,则可看成是n个有序子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。

2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。

#include <iostream>  
using namespace std;  
#include<list>  
  
#define M 21  
  
typedef int SqList[M];   
void Merge(SqList &L,int left,int mid,int right)         //2-路归并排序  
{  
    SqList L1;                                           //定义一个新数组  
    int i = left, j = mid+1, p = 0;                      //分成两部分  
    while(i <= mid && j <= right)                        //两部分序列开始比较  
    {  
        if(L[i] <= L[j])                                  //排序  
        {  
            L1[p++] = L[i++];                            //插入到新的空间内  
        }  
        else  
        {  
            L1[p++] = L[j++];                            
        }  
    }  
    while(i <= mid)                                      //左半部分序列多  
    {  
        L1[p++] = L[i++];  
    }  
    while(j <= right)                                    //右半部分序列多  
    {  
        L1[p++] = L[j++];  
    }  
    for(p = 0,i = left;i <= right;++p,++i)               //重新拷贝到原数组中  
    {  
        L[i] = L1[p];  
    }  
}  
  
void MSort(SqList &L,int left,int right)                   
{  
    if(left >= right)                                     //长度小于等于1  
    {  
        return;  
    }  
    else  
    {  
        int mid = (left+right)/2;                         //中值  
        MSort(L,left,mid);                                //左排序  
        MSort(L,mid+1,right);                             //右排序  
        Merge(L,left,mid,right);                          //归并  
    }  
}  
  
void main()  
{  
    SqList sq = {49,38,65,97,76,13,27};   
    for(int i = 0;i < 7; ++i)  
    {  
        cout<<sq[i]<<" ";  
    }  
    cout<<endl;  
    MSort(sq,0,6);  
    for(i = 0;i < 7; ++i)  
    {  
        cout<<sq[i]<<" ";  
    }  
    cout<<endl;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值