Cod sursa(job #2674954)

Utilizator Teodor94Teodor Plop Teodor94 Data 20 noiembrie 2020 21:10:23
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;

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 MAX_N 500000

int v[MAX_N];

void sort(int v[], int left, int right, int bitNumber) {
  if (left >= right || bitNumber == -1)
    return;

  int i = left, j = right;
  while (i <= j && (v[i] & (1 << bitNumber)) == 0)
    ++i;
  while (j >= i && (v[j] & (1 << bitNumber)) > 0)
    --j;

  while (i < j) {
    swap(v[i], v[j]);

    while (i <= j && (v[i] & (1 << bitNumber)) == 0)
    ++i;
    while (j >= i && (v[j] & (1 << bitNumber)) > 0)
      --j;
  }

  j = left;
  while (j <= right && (v[j] & (1 << bitNumber)) == 0)
    ++j;

  // [left, j - 1]
  sort(v, left, j - 1, bitNumber - 1);
  // [j, right]
  sort(v, j, right, bitNumber - 1);
}

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

  // Sortam intre [0, n - 1], pornind de la cel mai semnificativ bit (al 30-lea)
  sort(v, 0, n - 1, 30);

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