您的位置:首页 > 编程语言 > C语言/C++

(C/C++)2-路归并排序

2016-09-22 20:24 155 查看
#include<iostream>

//#include<cstdlib>

#include <typeinfo>

#define N 100

using namespace std;

void Merge(int* R,int low,int mid,int high)

    {

     //用分治法对R[low..high]进行二路归并排序    

     //int *R1=(int*)malloc((high-low+1)*sizeof(int));

        int *R1=new int[high-low+1];

        int i,j,p=0;

        i=low; j=mid+1;

        if(!R1)  

        {  

                return;                         //申请空间失败  

        }  

        while(i<=mid&&j<=high)               //两子文件非空时取其小者输出到R1[p]上

        {

            R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];   

        }    

        while(i<=mid)                        //若第1个子文件非空,则复制剩余记录到R1中

        {

            R1[p++]=R[i++];

        }

        while(j<=high)                       //若第2个子文件非空,则复制剩余记录到R1中

        {

            R1[p++]=R[j++];

        }

        for(p=0,i=low;i<=high;i++,p++)

        {

            R[i]=R1[p];                      //归并完成后将结果复制回R[low..high]  
        } 

     delete [] R1;

    }

    

void MergeSort(int* R, int low,int high)

{

    int mid;

    mid=(low+high)/2;

    if(low<high)

    {

        MergeSort(R,low,mid);      //递归将[low..mid]进行排序

        MergeSort(R,mid+1,high);   //递归将[mid+1..high]进行排序

        Merge(R,low,mid,high);     //将上面两组有序数列 合并到R[low..high]中

    }

}

int main()

{

    int R
;  

    int i,n,low,high;

    

    cin>>n;

    low=0;high=n-1;

    

    for(i=0;i<n;i++)

        cin>>R[i];

    MergeSort(R,low,high);

    

    for(i=0;i<n;i++)

        cout<<R[i]<<" ";

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息