#include <bits/stdc++.h>
using namespace std;
void merge (int X[],int bt1,int w1,int bt2,int w2, int Z[]) {
int i=bt1, j=bt2, bp1=bt1+w1-1, bp2=bt2+w2-1, k=bt1;
while (i<=bp1 && j<=bp2) {
if (X[i]<X[j]){
Z[k] = X[i];
i++; k++;
}
else {
Z[k] = X[j];
j++; k++;
}
}
while (i<=bp1) {
Z[k] = X[i];
i++; k++;
}
while (j<=bp2) {
Z[k] = X[j];
j++; k++;
}
}
void mergePass(int X[],int n,int K,int Z[]){
int cv = n/(2*K);
int s = 2*K*cv;
int r = n-s;
for (int j=1; j<=cv; j++){
int b1 = (2*j -2)*K;
merge(X, b1, K, b1+K, K, Z);
}
if (r<=K)
for (int j=0; j<r; j++)
Z[s+j] = X[s+j];
else
merge(X, s,K, s+K, r-K, Z);
}
void mergeSort (int X[],int n)
{
int K = 1;
int *Z = new int[n]();
while (K < n)
{
mergePass(X, n, K, Z);
mergePass(Z, n, 2*K, X);
K = K*4;
}
}
void createNumber(int A[], int n)
{
srand((int)time(0));
for (int i = 0; i < n; ++i)
{
A[i] = -10000 + rand() %(10000- (-10000) + 1);
}
}
void show(int A[], int n)
{
for (int i = 0; i < n; ++i)
{
cout<<A[i]<<" ";
}
}
int main(int argc, char const *argv[])
{
int n = 10;
int *A = new int[n];
createNumber(A,n);
show(A,n);
cout<<endl;
mergeSort(A,n);
show(A,n);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgbWVyZ2UgKGludCBYW10saW50IGJ0MSxpbnQgdzEsaW50IGJ0MixpbnQgdzIsIGludCBaW10pIHsKCWludCBpPWJ0MSwgaj1idDIsIGJwMT1idDErdzEtMSwgYnAyPWJ0Mit3Mi0xLCBrPWJ0MTsKCXdoaWxlIChpPD1icDEgJiYgajw9YnAyKSB7CgkJaWYgKFhbaV08WFtqXSl7CgkJCVpba10gPSBYW2ldOwoJCQlpKys7IGsrKzsKCQl9CgkJZWxzZSB7CgkJCVpba10gPSBYW2pdOwoJCQlqKys7IGsrKzsKCQl9Cgl9Cgl3aGlsZSAoaTw9YnAxKSB7CgkJWltrXSA9IFhbaV07CgkJaSsrOyBrKys7Cgl9Cgl3aGlsZSAoajw9YnAyKSB7CgkJWltrXSA9IFhbal07CgkJaisrOyBrKys7IAoJfQp9CnZvaWQgbWVyZ2VQYXNzKGludCBYW10saW50IG4saW50IEssaW50IFpbXSl7CglpbnQgY3YgPSBuLygyKkspOyAKCWludCBzID0gMipLKmN2OwoJaW50IHIgPSBuLXM7Cglmb3IgKGludCBqPTE7IGo8PWN2OyBqKyspewoJCWludCBiMSA9ICgyKmogLTIpKks7CgkJbWVyZ2UoWCwgYjEsIEssIGIxK0ssIEssIFopOwoJfQoJaWYgKHI8PUspCgkJZm9yIChpbnQgaj0wOyBqPHI7IGorKykKCQkJWltzK2pdID0gWFtzK2pdOwoJZWxzZQoJCW1lcmdlKFgsIHMsSywgcytLLCByLUssIFopOwp9CnZvaWQgbWVyZ2VTb3J0IChpbnQgWFtdLGludCBuKQp7CglpbnQgSyA9IDE7CglpbnQgKlogPSBuZXcgaW50W25dKCk7Cgl3aGlsZSAoSyA8IG4pCgl7CgkJbWVyZ2VQYXNzKFgsIG4sIEssIFopOwoJCW1lcmdlUGFzcyhaLCBuLCAyKkssIFgpOwoJCUsgPSBLKjQ7Cgl9Cn0Kdm9pZCBjcmVhdGVOdW1iZXIoaW50IEFbXSwgaW50IG4pCnsKCXNyYW5kKChpbnQpdGltZSgwKSk7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKCXsKCQlBW2ldID0gLTEwMDAwICsgcmFuZCgpICUoMTAwMDAtICgtMTAwMDApICsgMSk7Cgl9Cn0Kdm9pZCBzaG93KGludCBBW10sIGludCBuKQp7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKCXsKCQljb3V0PDxBW2ldPDwiICI7Cgl9Cn0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKewoJaW50IG4gPSAxMDsKCWludCAqQSA9IG5ldyBpbnRbbl07CgljcmVhdGVOdW1iZXIoQSxuKTsKCXNob3coQSxuKTsKCWNvdXQ8PGVuZGw7CgltZXJnZVNvcnQoQSxuKTsKCXNob3coQSxuKTsKCXJldHVybiAwOwp9