Pagini recente » Cod sursa (job #1532957) | Cod sursa (job #625871) | Cod sursa (job #2334628) | Istoria paginii runda/cex02 | Cod sursa (job #1839102)
#include <iostream>
#include <cmath>
#include <climits>
//#define INT_MAX 2147483647
using namespace std;
int A[500010];
int B[500005];
int N;
int lung_bloc, nr_bloc;
void calcMin(){
int j = 0;
int minim = 0;
for(int i=0; i<nr_bloc; i++){
minim = A[j];
for(int k=0; k<lung_bloc; k++){
if(A[j] < minim)
minim = A[j];
j++;
}
B[i] = minim;
}
minim = A[nr_bloc*lung_bloc];
for(int i=nr_bloc*lung_bloc; i<N; i++){
if(A[i] < minim)
minim = A[i];
}
if(nr_bloc*lung_bloc < N){
B[nr_bloc] = minim;
nr_bloc++;
}
}
int query(int st, int dr){
int st_bloc = st/lung_bloc;
int dr_bloc = dr/lung_bloc;
int minim = A[st];
while((st % lung_bloc)!=0 && (st <= dr)){
if(A[st] < minim)
minim = A[st];
st++;
}
while(((dr+1)%lung_bloc!=0) && (dr > st)){
if(A[dr] < minim)
minim = A[dr];
dr--;
}
if((dr - st+1) >= lung_bloc )
for(int i=st_bloc; i<=dr_bloc; i++)
if(B[i] < minim)
minim = B[i];
return minim;
}
void update_bloc(int i, int minim){
int k = i* lung_bloc;
int j= k;
for(int k=0; k<lung_bloc && j<N; k++){
if(A[j] == minim){
A[j] = INT_MAX;
break;
}
j++;
}
j=k;
minim = A[j];
for(int k=0; k<lung_bloc && j<N; k++){
if(A[j] < minim)
minim = A[j];
j++;
}
B[i] = minim;
}
void afis(){
cout << "A[]:\n";
for(int i=0; i<N; i++)
cout << A[i] << " ";
cout << endl;
}
void sort_batog(){
for(int j=0; j<N; j++){
// afis();
bool flag = 0;
int minim = B[0];
int pos_min = 0;
for(int i=0; i<nr_bloc; i++){
if(B[i] < minim){
minim = B[i];
pos_min = i;
}
//cout << B[i] << "# ";
}
// cout << endl;
B[pos_min] = INT_MAX;
update_bloc(pos_min, minim);
printf("%d ", minim);
}
}
int main()
{
freopen("algsort.in","r", stdin);
freopen("algsort.out","w", stdout);
scanf("%d", &N);
for(int i=0; i<N; i++)
scanf("%d", &A[i]);
lung_bloc = sqrt(N);
nr_bloc = N/lung_bloc;
calcMin();
sort_batog();
return 0;
}