Pagini recente » Istoria paginii utilizator/denisafrancu | Cod sursa (job #2052556) | Profil standragos98 | Profil RebornX | Cod sursa (job #804975)
Cod sursa(job #804975)
#include <cstdio>
#include <cstdlib>
#include <ctime>
const int MAX_SIZE(500000);
int v [MAX_SIZE];
int n;
inline void read (void)
{
std::freopen("algsort.in","r",stdin);
std::scanf("%d",&n);
for (int *iterator(v), *end(v + n) ; iterator < end ; ++iterator)
std::scanf("%d",iterator);
std::fclose(stdin);
}
inline void print (void)
{
std::freopen("algsort.out","w",stdout);
for (int *iterator(v), *end(v + n) ; iterator < end ; ++iterator)
std::printf("%d ",*iterator);
std::putchar('\n');
std::fclose(stdout);
}
inline void quicksort (int left, int right)
{
std::srand(std::time(0));
const int STACK_SIZE(100);
struct interval
{
int left;
int right;
} stack [STACK_SIZE], *top(stack + 1);
stack[1].left = left;
stack[1].right = right;
int i, j, pivot, temp;
do
{
i = left = top->left;
j = right = top->right;
pivot = v[left + (std::rand() % (right - left + 1))];
while (i <= j)
{
while (v[i] < pivot)
++i;
while (v[j] > pivot)
--j;
if (i <= j)
{
temp = v[i];
v[i] = v[j];
v[j] = temp;
++i;
--j;
}
}
--top;
if (left < j)
{
++top;
top->left = left;
top->right = j;
}
if (right > i)
{
++top;
top->left = i;
top->right = right;
}
}
while (top > stack);
}
int main (void)
{
read();
quicksort(0,n-1);
print();
return 0;
}