Cod sursa(job #2680790)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 4 decembrie 2020 13:11:07
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#define NMAX 500000
#define NR_BUCKETS (1 << 16)
#define VALUES_PER_BUCKETS_BITS 15

using namespace std;

int v[NMAX + 3], v1[NMAX + 3], f[NR_BUCKETS + 3], ind[NR_BUCKETS + 3];

inline int bucketnr(int a){
  return a >> VALUES_PER_BUCKETS_BITS;
}
void myqsort(int begin, int end){
  int b = begin, e = end, piv = v1[(b + e) / 2], aux;
  while (v1[b] < piv)
    b++;
  while (v1[e] > piv)
    e--;
  while (b < e) {
    aux = v1[b]; v1[b] = v1[e]; v1[e] = aux;
    do
     b++;
    while (v1[b] < piv);
    do
     e--;
    while (v1[e] > piv);
  }
  if (begin < e)
    myqsort(begin, e);
  if (e + 1 < end)
    myqsort(e + 1, end);
}
int main(){
  FILE *fin ,*fout;
  fin = fopen("algsort.in","r");
  fout = fopen("algsort.out","w");
  int nr,n,maxx;
  maxx = 0;
  fscanf(fin ,"%d" ,&n);
  for (int i = 0;i < n; ++i)
    fscanf(fin ,"%d", &v[i]);
  for (int i = 0; i < n; ++i){
    nr = bucketnr(v[i]);
    f[nr] ++;
    if(nr > maxx){
      maxx = nr;
    }
  }
  for (int i = 1; i <= maxx; ++i){
    ind[i] = ind[i - 1] + f[i - 1];
  }
  for (int i = 0; i < n; ++i){
    nr = bucketnr(v[i]);
    v1[ind[nr]] = v[i];
    ind[nr] ++;
  }
  myqsort ( 0 , f[0] - 1);
  for (int i = 1;i <= maxx; ++i) {
    f[i] += f[i - 1];
    myqsort(f[i - 1] ,f[i] - 1);
  }
  for (int i = 0; i < n; ++i){
    fprintf(fout ,"%d " ,v1[i]);
  }
  return 0;
}