Cod sursa(job #2664783)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 29 octombrie 2020 12:47:38
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#define maxn 500000

int v[maxn+5], u[maxn+5];

int read_array (FILE* fin, int* v) {
  int n; fscanf(fin, "%d", &n);
  int i;
  for (i = 0; i < n; i++) fscanf(fin, "%d", &v[i]);
  return n;
}

void print_array (FILE* fout, int n, int* v) {
  int i;
  for (i = 0; i < n; i++) fprintf(fout, "%d ", v[i]);
  fprintf(fout, "\n");
}

void swap (int* a, int* b) {
  int aux = *a;
  *a = *b;
  *b = aux;
}

void msort (int n, int* v, int l, int r, int* u) {
  if (l >= r) return;
  if (l+1 == r) {
    if (v[l] > v[r]) swap(&v[l], &v[r]);
    return;
  }
  int mid = (l + r) / 2;
  msort(n, v, l, mid, u);
  msort(n, v, mid+1, r, u);
  int i = l, j = mid+1, z = 0;
  while (i <= mid && j <= r) {
    if (v[i] < v[j]) u[z++] = v[i++];
    else u[z++] = v[j++];
  }
  while (i <= mid) u[z++] = v[i++];
  while (j <= r) u[z++] = v[j++];
  for (i = l; i <= r; i++) v[i] = u[i-l];
}

int main() {
  FILE* fin = fopen("algsort.in", "r");
  FILE* fout = fopen("algsort.out", "w");
  int n = read_array(fin, v);
  msort(n, v, 0, n-1, u);
  print_array(fout, n, v);
  fclose(fin);
  fclose(fout);
  return 0;
}