Pagini recente » Cod sursa (job #3347677) | Cod sursa (job #852792) | Cod sursa (job #1719393) | Monitorul de evaluare | Cod sursa (job #2493366)
#include <bits/stdc++.h>
using namespace std;
int v[500010], aux[500010], i, j, n;
/// [1, n]
void merge_sort( int st, int dr )
{
if( dr <= st )
return;
int mij = (st + dr) / 2;
merge_sort(st, mij);
merge_sort(mij+1, dr);
int ps = st, pd = mij + 1;
int i = 1;
while( ps <= mij || pd <= dr )
{
if( ps <= mij && pd <= dr )
{
if( v[ps] <= v[pd] )
{
aux[ i ] = v[ps];
ps++;
}
else
{
aux[ i ] = v[pd];
pd++;
}
}
else if( ps <= mij )
{
aux[ i ] = v[ps];
ps++;
}
else
{
aux[ i ] = v[pd];
pd++;
}
i++;
}
for(int i = st ; i <= dr ; i++)
{
v[ i ] = aux[ i - st + 1 ];
}
}
void quick_sort( int st, int dr )
{
if( dr == st + 1 )
{
if( v[st+1] < v[st] )
swap( v[st+1], v[st] );
}
if( dr <= st ) return;
int pivot = st + rand() % (dr-st);
pivot = v[ pivot ];
int ps = st, pd = dr;
while( ps < pd )
{
while( ps < dr && v[ps] <= pivot )
ps++;
while( pd > st && v[pd] > pivot )
pd--;
if( ps <= pd && v[ps] > pivot && v[pd] <= pivot )
swap( v[ps], v[pd] );
}
int pozp, mici=0;
for(int i = st ; i <= dr ; i++)
{
if( v[i] == pivot )
pozp = i;
if( v[i] <= pivot )
mici++;
}
swap( v[pozp], v[st+mici-1] );
quick_sort( st , st+mici-2 );
quick_sort( st + mici, dr );
}
int main()
{
ifstream cin("algsort.in");
ofstream cout("algsort.out");
srand(time(0));
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> v[i];
}
quick_sort(1, n);
for(int i = 1 ; i <= n ; i++)
{
cout << v[i] << ' ';
}
return 0;
}