Pagini recente » Cod sursa (job #787226) | Cod sursa (job #1209563) | Cod sursa (job #316051) | Cod sursa (job #2770882) | Cod sursa (job #2680683)
#include <bits/stdc++.h>
using namespace std;
#define MAXN 500000
int v1[MAXN], v2[MAXN];
#define BUCKETS (1<<16)
#define BUCKET_LEN (1<<15)
int freq[BUCKETS], index[BUCKETS];
int bucket(int n){
return n/BUCKET_LEN;
}
void myswap(int *a, int *b){
int aux=*a;
*a=*b;
*b=aux;
}
void mysort(int left, int right){
if (left>=right) return;
//printf("lest=%d, right=%d\n", left, right);
int pivot=v2[(left+right)/2];
int i1=left, i2=right;
while(v2[i1]<pivot) i1++;
while(v2[i2]>pivot) i2--;
while(i2>i1){
myswap(&v2[i1], &v2[i2]);
do i1++; while(v2[i1]<pivot);
do i2--; while(v2[i2]>pivot);
}
//if (left==0 && right==5) printf("i1=%d, i2=%d\n", i1, i2);
//printf("left=%d, right=%d\n", left, right);
if (left<i2) mysort(left, i2);
if (i2+1<right) mysort(i2+1, right);
}
int main()
{
FILE *fin, *fout;
fin=fopen("algsort.in", "r");
fout=fopen("algsort.out", "w");
int n;
fscanf(fin, "%d", &n);
int i;
for(i=0; i<n; i++) fscanf(fin, "%d", &v1[i]);
for(i=0; i<n; i++) freq[bucket(v1[i])]++;
for(i=1; i<=BUCKETS; i++){
index[i]=index[i-1]+freq[i-1];
}
for(i=0; i<n; i++){
v2[index[bucket(v1[i])]++]=v1[i];
}
//for (i=0; i<n; i++)printf("%d ", v2[i]);
//printf("index[0]=%d\n", index[0]);
mysort(0, index[0]-1);
for(i=1; i<BUCKETS; i++){
mysort(index[i-1], index[i]-1);
}
for (i=0; i<n; i++)fprintf(fout, "%d ", v2[i]);
return 0;
}