Cod sursa(job #2680683)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 3 decembrie 2020 22:10:34
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#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;
}