归并排序练习.
今日看了算导上关于归并排序的思想没看伪代码试着自己先练习下:
#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中每次选出最小值传入,类似于两个栈的操作.
这只是第一次随手写的暂时未发现问题,以后写的更好再更.