1002 归并排序

归并排序的思想是,
1.把一个数组分成两个部分
2.把这两个数组相对应位置的元素一起比较,小的先存入临时数组temp[](利用merge()函数)
3.若这两个数组中元素个数不相等,即一个数组中的元素多于另一个,则待个数少的数组的元素全部放完后,把元素多的数组的剩余元素按顺序全部放入temp[]中
4.用mergesort函数把刚才操作的数组分成左右两部分,重复1、2、3步的操作
注意:每次调用merge()后,都要把temp[]中的元素赋给a[]的相应部分(这样才能在上一次的基础上再进行比较),而且在吧temp[]中元素的值赋给a[]时,范围从start到end就可以了,因为每次在merge()中参与重新排序的就是start到end之间的这段范围。
具体实现为:
for(i=start;i<=end;i++)
a[i]=temp[i];

#include <iostream>

using namespace std;
int n;
int a[10000],temp[10000];
void merge(int start,int mid,int end)
{
    int i=start,j=mid+1,k=start;
    while(i<=mid&&j<=end)                 //排序
    {
        if(a[i]<a[j])
            temp[k++]=a[i++];
        else
            temp[k++]=a[j++];
    }
    while(i<=mid)
        temp[k++]=a[i++];
    while(j<=end)
        temp[k++]=a[j++];
}
void mergesort(int start,int end)
{
    if(start<end)
    {
        int i,mid;
        mid=(start+end)/2;
        mergesort(start,mid);                               //再次划分数组
        mergesort(mid+1,end);
        merge(start,mid,end);                             //本次排序
        for(i=start;i<=end;i++)
            a[i]=temp[i];
    }
}
int main()
{
    int i;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    mergesort(0,n-1);
    for(i=0;i<n;i++)
        cout<<temp[i]<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值