Pagini recente » Cod sursa (job #2524715) | Cod sursa (job #396557) | Cod sursa (job #2802282) | Cod sursa (job #1864608) | Cod sursa (job #1838038)
#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;
}
}
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) > 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; k++){
if(A[j] == minim){
A[j] = INT_MAX;
break;
}
j++;
}
j=k;
minim = A[j];
for(int k=0; k<lung_bloc; k++){
if(A[j] < minim)
minim = A[j];
j++;
}
B[i] = minim;
}
void sort_batog(){
// cout << "*" << nr_bloc*lung_bloc << endl;
for(int j=0; j<N; j++){
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;
}
}
if(nr_bloc*lung_bloc < N){
for(int i=nr_bloc*lung_bloc; i<N; i++){
if(A[i] < minim){
minim = A[i];
pos_min = i;
flag = 1;
}
}
}
if(flag == 1){
A[pos_min] = INT_MAX;
}
else{
B[pos_min] = INT_MAX;
//cout << "B[" << pos_min << "] " << B[pos_min] << " ";
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();
/*for(int i=0; i<N/(int)sqrt(N); i++)
cout << B[i] << " ";
*/
sort_batog();
return 0;
}