Cod sursa(job #1019347)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 30 octombrie 2013 22:55:16
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>
using namespace std;

int v[500000];

void sort (int *v, int n);
void swap (int &a, int &b);
void quicksort (int *v, int left, int right);
int  partition (int *v, int left, int right);

void sort (int *v, int n)
{
  quicksort(v, 0, n - 1);
}

void swap (int &a, int &b)
{
  int tmp = a;
  a = b;
  b = tmp;
}

void quicksort (int *v, int left, int right)
{
  if (left < right)
    {
      int pi = partition (v, left, right);
      quicksort (v, left, pi - 1);
      quicksort (v, pi + 1, right);
    }
}

int partition (int *v, int left, int right)
{
  srand(time(NULL));

  int pivot = left + rand() % (right - left);
  
  swap (v[right], v[pivot]);
  int store = left;

  for (int i = left; i < right; ++i)
    if (v[i] < v[right])
      {
	swap (v[i], v[store]);
	++store;
      }
  swap (v[store], v[right]);
  
  return store;
}

int main()
{
  FILE *fin, *fout;
  fin  = fopen ("algsort.in", "r");
  fout = fopen ("algsort.out", "w");

  int n; 
  fscanf (fin, "%d", &n);
  for (int i = 0; i < n; ++i)
    fscanf (fin, "%d", &v[i]);

  sort (v, n);
  
  for (int i = 0; i < n; ++i)
    fprintf (fout, "%d ", v[i]);

  fclose(fin);
  fclose(fout);

  return 0;
}