归并排序练习.

今日看了算导上关于归并排序的思想没看伪代码试着自己先练习下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<time.h>
using namespace std;
#define inf 2147483647+5
int b[1200];
void MergeSort(int a[],int l,int r)
{
    if(l==r) {
        return;
    }
    else{
        int mid=(l+r)/2,t1=l,t2=mid+1;
        MergeSort(a,l,mid);
        MergeSort(a,mid+1,r);
        for(int i=l;i<=r;++i) b[i]=a[i];    
    for(int i=l;i<=r;++i){
        if(t1==mid+1) {a[i]=b[t2++];continue;}
        if(t2==r+1)   {a[i]=b[t1++];continue;}
        if(b[t1]<=b[t2]) a[i]=b[t1++];
        else             a[i]=b[t2++];
    }
    }
}
int main()
{
    int a[1005],b[1005],n,m,i,j;
    while(cin>>n){
        for(i=1;i<=n;++i) a[i]=rand()%10000-333;
        MergeSort(a,1,n);
        for(i=1;i<=n;++i) printf("%d%c",a[i],i==n?' ':' ');
    }
    return 0;
}

注意红色处合并完左右两部分以后a中只是中点两边各有序a不一定有序,我们还需要O(N)的复杂度对a进行调整,先将此时范围a拷贝至b中,在从b向a中每次选出最小值传入,类似于两个栈的操作.

这只是第一次随手写的暂时未发现问题,以后写的更好再更.

原文地址:https://www.cnblogs.com/zzqc/p/7122826.html