446: 合并排序

 

题目描述

这是一个很简单的排序题目. 为了锻炼大家对不同算法的了解,请大家用归并排序法对此题进行解答. 对一组整数数列A[1],A[2],A[3]......A[N]进行排序,按照从小到大的顺序输出.

输入
本题只有一组测试数据,在输入的第一行输入N(表示整数数列的大小)(N < 1000)
接下来N行输入N个整数,每一行一个整数.
输出
对已经排好序的数从小到大依次输出,每两个数之间用两个空格隔开,且每输出10个数换行.

#include<bits/stdc++.h>
using namespace std;
void merge(int b[],int a[],int left,int right) {
    int mid=left+(right-left)/2;
    int l=right-left+1;//求要排序 部分的长度
    int left0=left; //记录a数组的起始坐标
    int i=0;//b数组下标从0开始
    int k=mid+1;// 后半部分数组的起始坐标 
    while(left<=mid&&k<=right){
        if(a[left]<a[k]){
            b[i++]=a[left++];//先赋值再自增 
        }
        else{
            b[i++]=a[k++];
        } 
    }
    if(left>mid){//前半部分数组已赋值完成,后半部分数组有剩余一个且是最大的(平分的),剩余的追加到b数组中 
        while(k<=right){
            b[i++]=a[k++];
        }
    }
    if(k>right){//后半部分数组已赋值完成,前半部分数组有剩余一个且是最大的(平分的),剩余的追加到b数组中 
        while(left<=mid){
            b[i++]=a[left++];
        }
    } 
    for(int j=0;j<l;j++){
        a[left0++]=b[j];//把b数组复制到a数组中 
    } 
}
void mergesort(int b[],int a[],int left,int right){
    if(left==right){//分成只剩1个数 
        return ;
    }
    else{
        int mid=left+(right-left)/2;
        mergesort(b,a,left,mid);//前半部分数组 
        mergesort(b,a,mid+1,right);//后半部分数组 
        merge(b,a,left,right);
    }
}
int main(){
    int n;
    cin>>n;
    int a[1001];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int b[1001]={0};
    mergesort(b,a,0,n-1);
    for(int i=0;i<n;i++){
        if((i+1)%10==0||i==n-1){
            cout<<a[i]<<endl;
        }
        else{
            cout<<a[i]<<"  ";
        }
    }
    return 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值