Merge Sort
Write a program of a Merge Sort algorithm implemented by the following pseudocode. You should also report the number of comparisons in the Merge function.
Merge(A, left, mid, right) n1 = mid - left; n2 = right - mid; create array L[0...n1], R[0...n2] for i = 0 to n1-1 do L[i] = A[left + i] for i = 0 to n2-1 do R[i] = A[mid + i] L[n1] = SENTINEL R[n2] = SENTINEL i = 0; j = 0; for k = left to right-1 if L[i] <= R[j] then A[k] = L[i] i = i + 1 else A[k] = R[j] j = j + 1 Merge-Sort(A, left, right){ if left+1 < right then mid = (left + right)/2; call Merge-Sort(A, left, mid) call Merge-Sort(A, mid, right) call Merge(A, left, mid, right)
Input
In the first line n is given. In the second line, n integers are given.
Output
In the first line, print the sequence S. Two consequtive elements should be separated by a space character.
In the second line, print the number of comparisons.
Constraints
- n ≤ 500000
- 0 ≤ an element in S ≤ 109
Sample Input 1
10 8 5 9 2 6 3 7 1 10 4
Sample Output 1
1 2 3 4 5 6 7 8 9 10 34
又抄了一份题解(那个34是归并排序比较的次数)代码如下
#include<iostream> #include<cstring> #include<stack> #include<cstdio> #include<cmath> using namespace std; #define MAX 500000 #define INF 2e9 int L[MAX/2+2],R[MAX/2+2]; int cnt; void merge(int A[],int n,int left,int mid,int right) { int n1=mid-left; int n2=right-mid; for(int i=0;i<n1;i++) { L[i]=A[left+i]; } for(int i=0;i<n2;i++) { R[i]=A[mid+i]; } L[n1]=INF; R[n2]=INF; int i=0,j=0; for(int k=left;k<right;k++)//合并 { cnt++; if(L[i]<=R[j]) A[k]=L[i++]; else A[k]=R[j++]; } } void mergeSort(int A[],int n,int left,int right) { if(left+1<right) { int mid=(left+right)/2; mergeSort(A,n,left,mid); mergeSort(A,n,mid,right); merge(A,n,left,mid,right); } } int main() { int A[MAX],n; cnt=0; cin>>n; for(int i=0;i<n;i++) cin>>A[i]; mergeSort(A,n,0,n); for(int i=0;i<n;i++) { if(i) cout<<" "; cout<<A[i]; } cout<<endl; cout<<cnt<<endl; return 0; }