Cod sursa(job #277938)

Utilizator AnDrEwBoYA Andrei AnDrEwBoY Data 11 martie 2009 23:22:39
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
#include<string.h>//doar pentru functai memeset


#define COUNT_N 256 //65536 pt long long
#define BYTE 8 // 16 pt long long


int a[500000],b[500000],count[COUNT_N],ind[COUNT_N];//long echivalent cu int sub g++


void rad(int *a,int *b,int byte,int n)
{ 
  memset(count,0,sizeof(count));
  int i,Lm = COUNT_N - 1;
  for(i = 1; i <= n; ++i) 
      ++count[(a[i]>>byte)&Lm];//respectiv for(i=0;i<n;++i) dak vreti sa incepeti de la 0
  ind[0] = 1;//se omite dak incepeti de la 0
  for(i = 1;i < COUNT_N; ++i) 
      ind[i] = ind[i-1] + count[i-1];
  for(i = 1; i <= n; ++i)
      b[ind[(a[i]>>byte)&Lm]++] = a[i];
}
void radix(int *a,int n)
{ 
  rad(a,b,     0,n);
  rad(b,a,  BYTE,n);
  rad(a,b,2*BYTE,n);
  rad(b,a,3*BYTE,n);
}

int tablou[500000];

int main(void)
{
    int n;
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
     scanf("%d",&tablou[i]);  
    radix(tablou,n);
    for(int i = 1; i <= n; i++)
      printf("%d ",tablou[i]);  
    fclose(stdin); fclose(stdout);
    return 0;
}