Cod sursa(job #2443591)

Utilizator gicugAndrei gicug Data 28 iulie 2019 17:31:55
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <memory>
#include <cstdint>
#include <utility>
#include <cstdio>

using Array = std::unique_ptr<uint32_t[]>;
using index_t = int;

void swap(const Array& a, index_t p1, index_t p2) {
  uint32_t aux = a[p1];
  a[p1] = a[p2];
  a[p2] = aux;
}

index_t partition(const Array& a, index_t lo, index_t hi) {
  const uint32_t pivot = a[hi];
  index_t i = lo;


  for (index_t j = lo; j < hi; ++j) {
    if (a[j] < pivot) {
      swap(a, i, j);
      i++;
    }
  }

  swap(a, i, hi);
  return i;
}

void quicksort(const Array& a, index_t lo, index_t hi) {
  if (lo > hi) {
    return;
  }
  index_t p = partition(a, lo, hi);
  quicksort(a, lo, p - 1);
  quicksort(a, p + 1, hi);
}

std::pair<Array, index_t> read() {
  FILE* fin = fopen("algsort.in", "r");
  index_t n;
  fscanf(fin, "%d", &n);
  static uint32_t arr[500000];
  Array a(&arr[0]);
  for (index_t i = 0; i < n; ++i) {
      fscanf(fin, "%d", &a[i]);
  }
  fclose(fin);
  return std::make_pair(std::move(a), n);
}

void print(const Array& a, index_t n) {
  FILE* fout = fopen("algsort.out", "w");
  for (index_t i = 0; i < n; ++i) {
     fprintf(fout, "%d ", a[i]);
  }
  fclose(fout);
}

int main() {
  auto a = read();
  quicksort(a.first, 0, a.second - 1);
  print(a.first, a.second);
  a.first.release();
  return 0;
}