Cod sursa(job #1506299)

Utilizator stoianmihailStoian Mihail stoianmihail Data 20 octombrie 2015 13:47:02
Problema Sortare prin comparare Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <assert.h>

#define Nadejde 500000
#define Mask 31

#define u32 unsigned int

int N;
u32 a[Nadejde];

/** Verifica daca bitul "x" din "val" este setat. **/
int getBit(u32 val, int x) {
  return (val >> x) & 1;
}

/** Sorteaza crescator portiunea [begin, end]. **/
void sort(int begin, int end, int bit) {
  int b = begin, e = end;
  while (b <= e) {
    while (!getBit(a[b], bit)) {
      b++;
    }
    while (getBit(a[e], bit)) {
      e--;
    }
    if (b <= e) {
      u32 tmp = a[b];
      a[b++] = a[e];
      a[e--] = tmp;
    }
  }
  if (bit) {
    if (begin < e) {
      sort(begin, e, bit - 1);
    }
    if (b < end) {
      sort(b, end, bit - 1);
    }
  }
}

int main(void) {
  int i;
  FILE *f = fopen("algsort.in", "r");

  /* Citeste vectorul. */
  fscanf(f, "%d", &N);
  for (i = 0; i < N; i++) {
    fscanf(f, "%u", &a[i]);
  }
  fclose(f);

  f = fopen("algsort.out", "w");

  sort(0, N - 1, Mask - 1);

  /* Afiseaza vectorul sortat. */
  for (i = 0; i < N; i++) {
    fprintf(f, "%u ", a[i]);
  }
  fputc('\n', f);
  fclose(f);

  /// Multumim Doamne!!
  puts("Doamne ajuta!");
  return 0;
}