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;
}

  

原文地址:https://www.cnblogs.com/Rosanna/p/3436705.html