Cod sursa(job #1741374)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 13 august 2016 19:26:59
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <algorithm>
#include <string>
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
using namespace std;

#ifdef INFOARENA
#define TEST 0
#else
#define TEST 1
#endif

class Sort {
public:
  Sort(const vector<int>& nums) {
    sorted_nums.resize(nums.size());
    for (int i = 0; i < nums.size(); ++i) {
      sorted_nums[i] = nums[i];
    }
    already_sorted = false;
  }
  void QuickSort(int left, int right) {
    int middle = (left + right) / 2;
    int pivot = sorted_nums[middle];
    int i = left, j = right;
    while (i < j) {
      while (sorted_nums[i] < pivot) i++;
      while (sorted_nums[j] > pivot) j--;
      if (i <= j) {
        swap(sorted_nums[i], sorted_nums[j]);
        i++;
        j--;
      }
    }
    if (i < right) QuickSort(i, right);
    if (j > left) QuickSort(left, j);
  }
  const vector<int>& GetSortedNums() {
    if (!already_sorted) {
      if (!sorted_nums.empty()) {
        QuickSort(0, sorted_nums.size() - 1);
      }
      already_sorted = true;
    }
    return sorted_nums;
  }
private:
  vector<int> sorted_nums;
  bool already_sorted;
};

int main() {
  vector<int> nums;
  if (TEST) {
    nums = vector<int>({4,1,7,5,1,3});
  } else {
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    int nums_size;
    scanf("%d", &nums_size);
    nums.resize(nums_size);
    for (int i = 0; i < nums_size; ++i) {
      scanf("%d", &nums[i]);
    }
  }

  Sort sort_instance(nums);
  vector<int> sorted_nums = sort_instance.GetSortedNums();
  for (int i = 0; i < sorted_nums.size(); ++i) {
    printf("%d ", sorted_nums[i]);
  }

  return 0;
}