Cod sursa(job #2674719)

Utilizator Teodor94Teodor Plop Teodor94 Data 19 noiembrie 2020 21:34:59
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <vector>
using namespace std;

void swap(int& a, int& b) {
  int aux = a;
  a = b;
  b = aux;
}

inline bool isDigit(char c) {
  return c >= '0' && c <= '9';
}

// citire numar natural
int readInt(FILE* fin) {
  char ch;
  int res = 0;

  // eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
  while (!isDigit(ch = fgetc(fin)));

  // adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
  do {
    res = 10 * res + ch - '0';
  } while (isDigit(ch = fgetc(fin)));

  return res;
}

#define NO_VALUES (1 << 31)
#define NO_BUCKETS (1 << 17)
#define VALUES_PER_BUCKET (1 << 14)
#define VALUES_PER_BUCKET_BITS 14

vector<int> bucket[NO_BUCKETS];

inline int getBucketNumber(int value) {
  return value >> VALUES_PER_BUCKET_BITS;
}

void sort(int bucketIndex) {
  vector<int>& v = bucket[bucketIndex];

  int i, j;
  for (i = v.size() - 1; i > 0; --i)
    for (j = i - 1; j >= 0; --j)
      if (v[i] < v[j])
        swap(v[i], v[j]);
}

int main() {
  FILE* fin = fopen("algsort.in", "r");
  int n, i, j, x;
  fscanf(fin, "%d", &n);
  for (i = 0; i < n; ++i) {
    x = readInt(fin);
    bucket[getBucketNumber(x)].push_back(x);
  }
  fclose(fin);

  for (i = 0; i < NO_BUCKETS; ++i)
    sort(i);

  FILE* fout = fopen("algsort.out", "w");
  for (i = 0; i < NO_BUCKETS; ++i)
    for (j = 0; j < bucket[i].size(); ++j)
      fprintf(fout, "%d ", bucket[i][j]);
  fclose(fout);
  return 0;
}