Cod sursa(job #642687)

Utilizator SimeneSimene Robert Simene Data 1 decembrie 2011 21:30:50
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include<stdio.h>
using namespace std;
bool ASCENDING=true, DESCENDING=false;
int a[500005];
void bitonicSort(int,int,bool);
void bitonicMerge(int,int,bool);

     void bitonicSort(int lo, int n, bool dir)
    {
        if (n>1)
        {
            int m=n/2;
            bitonicSort(lo, m, ASCENDING);
            bitonicSort(lo+m, m, DESCENDING);
            bitonicMerge(lo, n, dir);
        }
    }

     void bitonicMerge(int lo, int n, bool dir)
    {
        if (n>1)
        {
            int m=n/2;
            for (int i=lo; i<lo+m; i++)
                if (dir==(a[i]>a[i+m])) a[i]=a[i]^a[i+m]^(a[i+m]=a[i]);
            bitonicMerge(lo, m, dir);
            bitonicMerge(lo+m, m, dir);
        }
    }
int putere(int m)
{int k=1;
    while (k<m/2+1)
    k=k*2;
    if (k*2!=m) m=k*2;
return m;
}
int main()
{int i,N,M;
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
    scanf("%d",&M);
    N=M;

for (i=0;i<M;i++)
    scanf("%d",&a[i]);
M=putere(M);
for (i=N+1;i<M;i++)
    a[i]=0;
bitonicSort(0,M, ASCENDING);

for (i=M-N;i<M;i++)
    printf("%d\n",a[i]);
return 0;
}