Cod sursa(job #2274059)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 1 noiembrie 2018 11:46:26
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
/**
  *  Worg
  */
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

FILE *fin = freopen("algsort.in", "r", stdin); FILE *fout = freopen("algsort.out", "w", stdout);

const int MAX_N = 5e5 + 5;

//-------- Data --------
int n;
int arr[MAX_N];
//-------- --------

void ReadInput() {
  scanf("%d", &n);

  for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
  }
}

int PartitionArray(int begin, int end) {
  int left = begin, right = end - 1, pivot = arr[begin + rand() % (end - begin)];

  while (left < right) {
    while (left < right && arr[left] < pivot) {
      left++;
    }

    while (left < right && arr[right] > pivot) {
      right--;
    }

    if (left < right) {
      std::swap(arr[left], arr[right]);
      left++; right--;
    }
  }

  int mid;

  if (left == right) {
    if (arr[left] < pivot) {
      mid = left + 1;
    } else {
      mid = left;
    }
  } else {
    mid = right + 1;
  }

  return mid;
}

void QuickSort(int begin, int end) {
  if (end - begin <= 1) return;

  int mid = PartitionArray(begin, end);
  ///  Facem call la [begin, mid) si [mid, end)

  if (mid != begin && mid != end) {
    QuickSort(begin, mid);
    QuickSort(mid, end);
  }
}

void PrintOutput() {
  for(int i = 0; i < n; i++) {
    printf("%d ", arr[i]);
  }
}

int main() {
  ReadInput();

  srand(time(NULL));
  QuickSort(0, n);

  PrintOutput();

  return 0;
}