1065-两路合并

描述

 

给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中两路合并排序算法进行排序,并输出排序最后结果的相应序列。

 

输入

 

共两行,第一行给出排序元素数目n,第二行给出n个元素,1n100000,每个元素值范围为 [0100000)

 

输出

 

一行,输出排序结果。

 

样例输入

7

48 36 68 72 12 48 2

样例输出

2 12 36 48 48 68 72

#include <iostream>

#define N 100000

using namespace std;

void merge(int a[],int i1,int j1,int i2,int j2)

{

    int *temp=new int[j2-i1+1];

    int i=i1,j=i2,k=0;

    while(i<=j1&&j<=j2)

        if(a[i]<=a[j])

            temp[k++]=a[i++];

        else 

            temp[k++]=a[j++];

    while (i<=j1) temp[k++]=a[i++];

    while (j<=j2) temp[k++]=a[j++];

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

        a[i1++]=temp[i];

    delete[] temp;

}

void mergesort(int a[],int n)

{

    int i1,j1,i2,j2;

    int size=1;

    while(size<n)

    {

        i1=0;

        while(i1+size<n)

        {

            i2=i1+size;

            j1=i2-1;

            if(i2+size-1>n-1)

                j2=n-1;

            else

                j2=i2+size-1;

            merge(a,i1,j1,i2,j2);

            i1=j2+1;

        }

        size*=2;

    }

}

int main()

{

    int n;

    int a[N]={0};

    cin>>n;

    for(int k=0;k<n;k++)

        cin>>a[k];

    mergesort(a,n);

    for(int kk=0;kk<n-1;kk++)

        cout<<a[kk]<<" ";

    cout<<a[n-1]<<endl;

    return 0;

}

  

你可能感兴趣的:(合并)