Cod sursa(job #2676773)

Utilizator YusyBossFares Yusuf YusyBoss Data 24 noiembrie 2020 22:59:07
Problema Sortare prin comparare Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <stdio.h>
#define NMAX 500000
#define NRBUCKETS (1 << 16)
#define VALUES_PER_BUCKET_BITS 15

using namespace std;

FILE *fin, *fout;
int n;
int v[NMAX + 1], v1[NMAX + 1], f[NRBUCKETS + 1], ind[NRBUCKETS + 1];

inline int bucketnr(int x) {
  return x >> VALUES_PER_BUCKET_BITS;
}

void citire() {
  int i;

  fin = fopen("algsort.in", "r");
  fscanf(fin, "%d", &n);
  for (i = 0; i < n; i++)
    fscanf(fin, "%d", &v[i]);
  fclose( fin );
}

void mysort(int begin, int end) {
  int b, e, piv, aux;

  b = begin; e = end; piv = v1[(b + e) / 2];

  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)
    mysort(begin, e);
  if (e + 1 < end)
    mysort(e + 1, end);
}

void afis() {
  int i;

  fout = fopen("algsort.out", "w");
  for (i = 0; i < n; i++)
    fprintf(fout, "%d ", v1[i]);
  fclose( fout );
}

int main() {
  int i, maxbuck, nr;

  citire();

  maxbuck = 0;
  for (i = 0; i < n; i++) {/// vad cate numere am in fiecare bucket
    nr = bucketnr(v[i]);

    f[nr]++;
    if (nr > maxbuck)
      maxbuck = nr;
  }

  for (i = 1; i <= maxbuck; i++)/// setez prima poz libera al fiecarui bucket
    ind[i] = ind[i - 1] + f[i];

  for (i = 0; i < n; i++) { /// adaug in vectorul v1 numerele, in ordinea bucketurilor
    nr = bucketnr(v[i]);
    v1[ind[nr]] = v[i];
    ind[nr]++;
  }

  mysort(0, f[0] - 1);
  for (i = 1; i <= maxbuck; i++) {
    f[i] += f[i - 1];
    mysort(f[i - 1], f[i] - 1);
  }

  afis();
  return 0;
}