Pagini recente » Cod sursa (job #325841) | Cod sursa (job #1775997) | Cod sursa (job #559844) | Cod sursa (job #1645686) | Cod sursa (job #1396005)
#include <fstream>
#define NM 500005
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int v[NM], n, i;
int aux[NM];
int MERGE(int p, int q, int r)
{
int k1, k2, i;
k1=p;
k2=q+1;
i=p;
while (k1<=q && k2<=r)
if (v[k1] <= v[k2])
aux[i++] = v[k1++];
else
aux[i++] = v[k2++];
while (k1<=q)
aux[i++] = v[k1++];
while (k2<=r)
aux[i++] = v[k2++];
for (i=p; i<=r; i++)
v[i]=aux[i];
// ai "primul vector" in v[p] ... v[q]
// al "doilea vector" in v[q+1] ... v[r]
// le interclasezi in aux[p] ... aux[r]
// si apoi copiezi la loc in v pe pozitiile corecte v[p] ... v[r]
}
int MERGESORT(int p, int r)
{
int q,s,l;
if (p<r-1 && r<=n)
{
l=r-p+1;
q=l / 3;
q+=p;
s=l / 3;
s=r-s;
MERGESORT(p, q);
MERGESORT(q+1, s);
MERGESORT(s+1, r);
MERGE(p, q, s);
MERGE(p, s, r);
}
if (p==r-1)
{
q=(p+r) / 2;
MERGE(p, q, r);
}
}
int main()
{
fin >> n;
for (i=1; i<=n; i++)
fin >> v[i];
MERGESORT(1, n);
for (i=1; i<=n; i++)
fout << v[i] << " ";
fout << '\n';
fin.close();
fout.close();
return 0;
}