OJ 1500 归并排序

描述

利用二分归并排序算法将读入的N个数从小到大排序后输出。


输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。

第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。


输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

请在每个整数后输出一个空格,并请注意行尾输出换行。


输入样例 1

10
2 8 4 6 1 10 7 3 5 9
输出样例 1

1 2 3 4 5 6 7 8 9 10

 

这题主要是二分归并排序,即把数组一分再分,每次都从中间分。然后再分到最后再进行一组一组的排序一段一段的拼接最后排序完成。

#include <iostream>

using namespace std;
int temp[100000];
int a[100000];
void MergeSort(int low,int mid,int high)
{
    int i=low;  //前半段
    int j=mid+1;  //后半段
    int k=low;  //辅助函数的位置
    while(i<=mid&&j<=high)//这一步结束之后并不是所有的数据都填入了辅助数组
    {
                            //如  前:1 3  后2 4  这个时候其实只有 1 2 3填入了辅助数组
        if(a[i]<a[j])
            temp[k++]=a[i++];
        else
            temp[k++]=a[j++];
    }
    //填入剩余的数据(后面两个while)
    while(i<=mid)
        temp[k++]=a[i++];
    while(j<=high)
        temp[k++]=a[j++];
    //将数据填入原
    for(k=low; k<=high; k++)
    {
        a[k]=temp[k];
    }
}
void Merge(int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        Merge(low,mid);//从中间往前拆
        Merge(mid+1,high);//从中间往后拆
        MergeSort(low,mid,high);//排序回归
    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
            cin>>a[i];
        Merge(0,n-1);
        for(int i=0; i<n; i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值