归并排序练习.

Posted zzq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序练习.相关的知识,希望对你有一定的参考价值。

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

#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?‘\n‘:‘ ‘);
    }
    return 0;
}

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

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

 

以上是关于归并排序练习.的主要内容,如果未能解决你的问题,请参考以下文章

归并排序练习.

归并排序练习

证明归并排序输出输入的排列

Coursera Algorithms week3 归并排序 练习测验1: Merging with smaller auxiliary array

Go初接触之归并排序

《算法零基础100讲》(第36讲) 排序进阶 - 归并排序