Cod sursa(job #2241504)

Utilizator TeodorLuchianovTeo Luchianov TeodorLuchianov Data 16 septembrie 2018 11:11:54
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb

#include <fstream>
#include <iostream>

using namespace std;

ifstream in("algsort.in");
ofstream out("algsort.out");

int const nmax = 500000;

int v[1 + nmax];//v1 v2
int vi[1 + nmax];

/*void interleave(int from1, int to1, int from2, int to2){
  int from3 = from1;
  int to3 = to2;

  int i1 = from1;  //se plimba prin v,  de la from1 la to1
  int i2 = from2;  //se plimba prin v,  de la from2 la to2
  int i3 = from3;  //se plimba prin vi, de la from3 la to3

  while(i3 <= to3) {
    if(i1 <= to1 && i2 <= to2) {
      if(v[i1] < v[i2]) {
        vi[i3] = v[i1];
        i1++;
      } else{
        vi[i3] = v[i2];
        i2++;
      }
    } else {
      if(i1 > to1) {
        vi[i3] = v[i2];
        i2++;
      } else {
        vi[i3] = v[i1];
        i1++;
      }
    } // O(n * log n)
    i3++;
  }*/

void interleave2(int from1, int to1, int from2, int to2){
  int from3 = from1;
  int to3 = to2;

  int i1 = from1;  //se plimba prin v,  de la from1 la to1
  int i2 = from2;  //se plimba prin v,  de la from2 la to2
  int i3 = from3;  //se plimba prin vi, de la from3 la to3

  while(i3 <= to3) {
    //if-uri care se ocupa de cazurile cand nu mai sunt gogosi intr-o tava
    if(i1 <= to1 && i2 > to2) {
      vi[i3] = v[i1];
      i1++;
    } else if(i1 > to1 && i2 <= to2) {
      vi[i3] = v[i2];
      i2++;
    } else if(v[i1] < v[i2]) {
      vi[i3] = v[i1];
      i1++;
    } else {
      vi[i3] = v[i2];
      i2++;
    }
    i3++;
  }
  for(int i = from3; i <= to3; i++) {
    v[i] = vi[i];
  }
}

  for(int i = from3; i <= to3; i++) {
    v[i] = vi[i];
  }
}

void mergesort(int from, int to) {
  if(from < to) {
    int mid = (from + to) / 2;
    mergesort(from, mid);
    mergesort(mid+1, to);
    interleave(from, mid, mid + 1, to);
  }
}

int main() {
  int n;
  in >> n;
  for(int i = 1; i <= n; i++) {
    in >> v[i];
  }
  mergesort(1, n);
  for(int i = 1; i <= n; i++) {
    out << v[i] << " ";
  }
  return 0;
}