Cod sursa(job #1294486)

Utilizator hrazvanHarsan Razvan hrazvan Data 17 decembrie 2014 17:28:58
Problema Radix Sort Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.73 kb
//3-way radix quicksort
#include <stdio.h>
#define MAXN 10000000
#define MASK ((1 << 8) - 1)
#define AFIS 10
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 > -1){
    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 > p){
        exch(j, p);
        p++;
        j--;
    }
    while(nr(v[j], c) == piv && j >= st)
     j--;
    while(nr(v[q], c) == piv && i < q){
      exch(i, q);
      q--;
      i++;
    }
    while(nr(v[i], c) == piv && i <= dr)
      i++;
    if(st < j)
      rsort(st, j, c);
    if(i < dr)
      rsort(i, dr, c);
    if(j + 1 < i - 1)
      rsort(j + 1, i - 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, 3);
  FILE *out = fopen("radixsort.out", "w");
  fprintf(out, "%d", v[0]);
  for(i = AFIS; i < n; i += AFIS)
    fprintf(out, " %d", v[i]);
  fclose(out);
  return 0;
}