Cod sursa(job #2220092)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 10 iulie 2018 15:18:53
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
/**
  *  Worg
  */
#include <cstdio>

FILE *fin = freopen("algsort.in", "r", stdin); FILE *fout = freopen("algsort.out", "w", stdout);

const int MAX_N = 5e5 + 5;
const int BYTE = 1 << 8;

/*-------- Data --------*/
int n;
int arr[MAX_N], aux[MAX_N];
int idx[BYTE];
/*-------- --------*/

void GenerateArray() {
  scanf("%d", &n);

  for(int i = 1; i <= n; i++) {
    scanf("%d", &arr[i]);
  }
}

void RadixSort() {
  const int bucketCount = 4;  //  Each bucket has 8 bits

  for(int bucket = 0; bucket < bucketCount; bucket++) {
    //  Reset the contors
    for(int i = 0; i < BYTE; i++) {
      idx[i] = 0;
    }

    //  Get each number's bucket corresponding to the current bit
    for(int i = 1; i <= n; i++) {
      int val = (arr[i] >> (bucket << 3)) & (BYTE - 1);
      idx[val]++;
    }

    //  Compute the contors
    for(int i = 1; i < BYTE; i++) {
      idx[i] += idx[i - 1];
    }

    //  Rearrange the numbers
    for(int i = n; i >= 1; i--) {
      int val = (arr[i] >> (bucket << 3)) & (BYTE - 1);

      aux[idx[val]] = arr[i];
      idx[val]--;
    }

    for(int i = 1; i <= n; i++) {
      arr[i] = aux[i];
    }
  }
}

int main() {
  GenerateArray();

  RadixSort();

  for(int i = 1; i <= n; i++) {
    printf("%d ", arr[i]);
  }

  return 0;
}