Pagini recente » Cod sursa (job #2717356) | Cod sursa (job #1615978) | Cod sursa (job #1622895) | Cod sursa (job #1152582) | Cod sursa (job #1786648)
//SortareBatog
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
#define NMAX 500000
#define MAX (((1<<30) - 1) + (1<<30))
#define MIN -1
unsigned N;
int v[NMAX+5], aux[NMAX+5], maxim;
unsigned i, j, pozMax;
void SortareBatog() {
unsigned rad = 1, step;
while(rad*rad < N) rad++; //caut sqrt(n)
int maximi[rad+1];
for(i = 1; i < rad ; i++) { //caut maximul din secventele 1...sqrt(n), sqrt(n)+1...2*sqrt(n), ...
step = (i-1)*rad;
maxim = 0;
for(j = 1 ; j <= rad ; j++) {
if(v[j+step] > maxim)
maxim = v[j+step];
}
maximi[i] = maxim;
}
maxim = 0;
for(i = (rad-1)*rad + 1 ; i <= N ; i++) //caut maximul din ultima secventa ( a carei lungime apartine intervalului [1, sqrt(n)] )
if(maxim < v[i])
maxim = v[i];
maximi[rad] = maxim;
for(i = N ; i >= 1 ; i--) {
maxim = maximi[1];
pozMax = 1;
for(j = 2 ; j <= rad ; j++)
if(maxim < maximi[j]) {
maxim = maximi[j];
pozMax = j;
}
//introduc valoarea in vectorul aux
aux[i] = maxim;
//recalculez maximul
if(pozMax == rad) { //caz particular
for(j = (rad-1)*rad + 1; j <= N ; j++) //stergem maximul
if(v[j] == maxim) {
v[j] = MIN;
j = N;
}
maxim = -1;
for(j = (rad-1)*rad + 1; j <= N ; j++) //recalculam maximul pe subsecventa
if(v[j] > maxim)
maxim = v[j];
}
else { //caz simplu
step = (pozMax-1)*rad;
for(j = 1 ; j <= rad ; j++) //stergem maximul
if(v[j+step] == maxim) {
v[j+step] = MIN;
j = rad;
}
maxim = -1;
for(j = 1 ; j <= rad ; j++) //recalculam maximul pe subsecventa
if(v[j+step] > maxim)
maxim = v[j+step];
//actualizez maximi[pozMax]
}
maximi[pozMax] = maxim;
}
for(i = 1 ; i <= N ; i++)
v[i] = aux[i];
for(i=1 ; i<=N ; i++)
cout<<v[i]<<' ';
}
int main()
{
fin>>N;
for(i = 1 ; i <= N ; i++)
fin>>v[i];
SortareBatog();
for(i = 1 ; i <= N ; i++)
fout<<v[i]<<' ';
fin.close();
fout.close();
return 0;
}