归并排序
模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| int n; const int N=1e5+5; int a[N],tmp[N];
void ms(int l,int r){ if(l>=r) return;
int mid=l+r>>1;
ms(l,mid); ms(mid+1,r);
int k=0,i=l,j=mid+1; while(i<=mid&&j<=r) if(a[i]<a[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++];
while(i<=mid) tmp[k++]=a[i++]; while(j<=r) tmp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j]; }
ms(0,n-1);
|
例题
P1177 【模板】排序 - 洛谷 | 计算机科学教育新生态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<bits/stdc++.h> using namespace std;
int n; const int N=1e5+5; int a[N],tmp[N];
void ms(int l,int r){ if(l>=r) return;
int mid=l+r>>1;
ms(l,mid); ms(mid+1,r);
int k=0,i=l,j=mid+1; while(i<=mid&&j<=r) if(a[i]<a[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++];
while(i<=mid) tmp[k++]=a[i++]; while(j<=r) tmp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j]; }
void work(){ cin>>n; for(int i=0;i<n;i++) cin>>a[i]; ms(0,n-1); for(int i=0;i<n;i++) cout<<a[i]<<" "; }
int main(){ work(); return 0; }
|