Cod sursa(job #1293761)

Utilizator hrazvanHarsan Razvan hrazvan Data 16 decembrie 2014 15:38:17
Problema Radix Sort Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.57 kb
//3-way radix quicksort
#include <stdio.h>
#define MAXN 10000000
#define MASK ((1 << 8) - 1)
int v[MAXN];

inline int nr(int x, int c){
  return (x >> (8 * c)) & MASK;
}

inline void exch(int a, int b){
  int aux;
  aux = v[a];
  v[a] = v[b];
  v[b] = aux;
}

void rsort(int st, int dr, int c){
  if(c < 4){
    int i = st, j = dr, piv = nr(v[(st + dr) / 2], c), p = st, q = dr;
    while(i <= j){
      while(nr(v[i], c) < piv)
        i++;
      while(nr(v[j], c) > piv)
        j--;
      if(i <= j){
        exch(i, j);
        if(nr(v[i], c) == piv){
          exch(i, p);
          p++;
        }
        if(nr(v[j], c) == piv){
          exch(j, q);
          q--;
        }
        i++;
        j--;
      }
    }
    if(i - j > 1){
      if(v[j + 1] > piv)
        i--;
      else  if(v[j + 1] < piv)
        j++;
    }
    p = st;  q = dr;
    while(nr(v[p], c) == piv && j > st){
        exch(j, p);
        p++;
        j--;
    }
    while(nr(v[q], c) == piv && i < dr){
      exch(i, q);
      q--;
      i++;
    }
    if(st < j)
      rsort(st, j, c);
    if(i < dr)
      rsort(i, dr, c);
    if(i + 1 < j - 1)
      rsort(i + 1, j - 1, c + 1);
  }
}

int main(){
  FILE *in = fopen("radixsort.in", "r");
  int n, a, b, c, i;
  fscanf(in, "%d%d%d%d", &n, &a, &b, &c);
  v[0] = b;
  for(i = 0; i < n; i++){
    v[i] = (a * v[i - 1] + b) % c;
  }
  fclose(in);
  rsort(0, n - 1, 0);
  FILE *out = fopen("radixsort.out", "w");
  for(i = 0; i < n; i += 10)
    fprintf(out, "%d ", v[i]);
  fclose(out);
  return 0;
}