1. 程式人生 > >歸並排序練習.

歸並排序練習.

%d r+ while 復雜度 紅色 using 進行 一次 ostream

今日看了算導上關於歸並排序的思想沒看偽代碼試著自己先練習下:

#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中每次選出最小值傳入,類似於兩個棧的操作.

這只是第一次隨手寫的暫時未發現問題,以後寫的更好再更.

歸並排序練習.