归并两个子数组
【问题描述】
有一个长度为N的数组,其中,[1,mid]区间已经有序,[mid+ 1,N]区间也已经有序,请把整个数组排成有序序列。
【输入】
第一行有两个数字,分别是数组长度N以及分界点mid, 1<=mid<N<=106。第二行有N个数字,用空格隔开
【输出】
排序之后的数组,数字之间用空格隔开,单独占一行。
【样例输入】
8 3
2 4 6 1 2 5 7 8
【样例输出】
1 2 2 4 5 6 7 8
#include<iostream> using namespace std; int a[1000001]={}; void gb(int a[], int n, int mid){ int temp[n+1]; int i=1; // 原数组的首元素的位置。 int j=mid+1; // 元素组下标为mid+1的元素位置。 int k=1; // 临时数组的下标。 while(i<=mid&&j<=n){ if(a[i]<=a[j]) temp[k++]=a[i++]; else temp[k++]=a[j++]; } // 如果左侧有数据,右侧无数据。 while(i<=mid) temp[k++]=a[i++]; // 如果右侧有数据,左侧无数据。 while(j<=n) temp[k++]=a[j++]; copy(temp+1, temp+n+1, a+1); } int main(){ int n, mid; cin>>n>>mid; for(int i=1; i<=mid; i++){ cin>>a[i]; } for(int i=mid+1; i<=n; i++){ cin>>a[i]; } gb(a, n, mid); for(int i=1; i<=n; i++){ cout<<a[i]<<" "; } return 0; }

浙公网安备 33010602011771号