Pagini recente » Cod sursa (job #855314) | Cod sursa (job #1207686) | Cod sursa (job #1339219) | Cod sursa (job #1419489) | Cod sursa (job #1872029)
#include <fstream>
using namespace std;
int a[500005], n;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
void read()
{
fin >> n;
for(int i = 0; i < n; i++)
fin >> a[i];
}
int qpart(int l, int r)
{
int i, j, x;
// Pre: l < r, frame: only a[l..r) changes, by a permutation
x = a[l];
i = l + 1;
j = r;
// inv: 0 < i <= j <= r && a[l..i - 1) < x <= a[j..r)
// a[l..i - 1) ++ [x] ++ a[i..r) is a permutation of the initial array
while(i != j)
{
while(i != j && (a[i] < x))
{
a[i - 1] = a[i];
i++;
}
while(i != j && (a[j - 1] >= x))
j--;
if(i != j) // a[j - 1] < x <= a[i]
{
a[i - 1] = a[j - 1];
a[j - 1] = a[i];
i++;
j--;
}
}
a[i - 1] = x;
return (i - 1);
}
void quicksort(int l, int r)
{
int i;
// Pre: l <= r && n > 0
if(r - l > 1)
{
i = qpart(l, r); //a[l..i) < a[i] <= a[i + 1..r)
quicksort(l, i);
quicksort(i + 1, r);
}
// Post: a[l..r) is a sorted permutation of the initial array
}
void write()
{
for(int i = 0; i < n; i++)
fout << a[i] << " ";
}
int main()
{
read();
quicksort(0, n);
write();
return 0;
}