Cod sursa(job #2615960)

Utilizator avtobusAvtobus avtobus Data 15 mai 2020 23:10:46
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < (int)(n); i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 0x3f3f3f3f;

ifstream fin ("algsort.in");
ofstream fout ("algsort.out");
const int Nmax = 500555;
int a[Nmax];
// insertion sort
inline void isort(int l, int r) {
  int x, j;
  for(int i = l; i <= r; i++) {
    x = a[i];
    for(j = i; j > l && a[j-1] > x; j--) { a[j] = a[j-1]; }
    a[j] = x;
  }
}

void mqsort(int l, int r) {
  // cout << string(40, '-') << l << "-" << r << string(40, '-') << endl;
  if (l>=r) { return; }
  else if (l + 1 == r) {
    if (a[l] > a[r]) { swap(a[l], a[r]); }
    return;
  }
  // if (l+5 >= r) {
  //   isort(v, l, r);
  //   return;
  // }

  int m = rand() % (r-l+1);
  int pivot = a[m];
  // if (a[l] > a[m]) { swap(a[l], a[m]); }
  // if (a[m] > a[r]) { swap(a[m], a[r]); }
  // if (a[l] > a[m]) { swap(a[l], a[m]); }

  int i = l, j = r;

  while(i < j) {
    while(i < j && a[i] < pivot) { i++; }
    while(j > i && a[j] > pivot) { j--; }
    if (i < j) {
      swap(a[i], a[j]);
      i++;
      j--;
    }
  }

  // i == j
  if (a[i] < pivot) {
    mqsort(l, i);
    mqsort(i+1, r);
  } else {
    mqsort(l, i-1);
    mqsort(i, r);
  }
}

int main(void) {
  // freopen("algsort.in", "r", stdin);
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);
  int n;
  fin >> n;
  // vi v(n);
  rep(i, n) {
    fin >> a[i];
  }
  // isort(v, 0, n-1);
  mqsort(0, n-1);
  // sort(v.begin(), v.end());
  rep(i, n) {
    fout << a[i] << " ";
  }
  fout << "\n";

  // mqsort(v, 0, n-1);

  return 0;
}