Cod sursa(job #916972)

Utilizator andreirulzzzUPB-Hulea-Ionescu-Roman andreirulzzz Data 17 martie 2013 03:13:48
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstdlib>
#define NMax 500001
#define MAXINT (1<<30)-1+(1<<30)
using namespace std;

void vector_doi(int a[]);
void citire(FILE *f, FILE *g, int v[], int *n, int *ind, int a[]);
void printv(int *v, int n);
void print_and_close(FILE *g, int v[], int n);

int main()
{ int a[32];
  vector_doi(a);
  
  int *v1, *v2, tr[2] = {0}, n, ind = 0;
  int **p1 = &v1, **p2 = &v2, **p;
  FILE *f, *g;
  v1 = (int*)malloc(NMax * sizeof(int));
  v2 = (int*)malloc(NMax * sizeof(int));
  citire(f, g, v1, &n, &ind, a);
  
  int bit = 1;
  while(!!(ind-- & -MAXINT)) 	
  { for(int i = 0; i < n && ((*(*p1+i) & bit)?++tr[1]:++tr[0]); i++);
	tr[1] += tr[0];
	for(int i = n ; i ; i--)
      if (*(*p1+i-1) & bit) --tr[1], *(*p2+tr[1]) = *(*p1+i-1);
	  else --tr[0], *(*p2+tr[0]) = *(*p1+i-1);
    bit <<= 1;
	tr[0] = tr[1] = 0;
	p = p1, p1 = p2, p2 = p;
  }
  
  print_and_close(g, *p1, n);
  
  return 0;
}

void print_and_close(FILE *g, int v[], int n)
{ g = fopen("algsort.out", "w");
  for(int i = 0; i < n; ++i)
	fprintf(g, "%d ", v[i]);
  fclose(g);
}

void citire(FILE *f, FILE *g, int v[], int *n, int *ind, int a[])
{
  f = fopen("algsort.in", "r");
  fscanf(f, "%d ", n);
  
  for(int i = 0; i < *n && (fscanf(f, "%d", &v[i])==1); i++)
	while(a[*ind] < v[i] && ++*ind);
  fclose(f);
  return;
}

void vector_doi(int a[])
{ a[0] = 1;
  for(int i = 1; i < 31; i++)
	a[i] = a[i-1] << 1;
  a[31] = MAXINT;
  return;
}