Cod sursa(job #2669704)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 7 noiembrie 2020 17:22:54
Problema Sortare prin comparare Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 500000

void merge2(int v[], int start, int mid, int end){
    int n1 = mid - start + 1, n2 = end - mid;
    int left[n1], right[n2];
    for (int i = 0; i < n1; i ++) left[i] = v[i + start];
    for (int i = 0; i < n2; i ++) right[i] = v[mid + i + 1];
    int i1, i2;
    i1 = i2 = 0;
    int ind = start;
    while (i1 < n1 && i2 < n2){
        while (i1 < n1 && left[i1] <= right[i2]) v[ind ++] = left[i1 ++];
        while (i2 < n2 && right[i2] < left[i1]) v[ind ++] = right[i2 ++];
    }
    while (i1 < n1 && left[i1] <= right[i2]) v[ind ++] = left[i1 ++];
    while (i2 < n2 && right[i2] < left[i1]) v[ind ++] = right[i2 ++];
}

void mergesort(int v[], int start, int end){
    if (start == end) return;
    int mid = (start + end) / 2;
    mergesort(v, start, mid);
    mergesort(v, mid + 1, end);
    merge2(v, start, mid, end);
}

int v[NMAX];

int main()
{
    FILE *fin, *fout;
    fin = fopen("algsort.in", "r");
    fout = fopen("algsort.out", "w");
    int n;
    fscanf(fin, "%d", &n);
    for (int i = 0; i < n; i++) fscanf(fin, "%d", &v[i]);
    merge2(v, 0, 3, 5);
    mergesort(v, 0, n-1);
    for (int i = 0; i < n; i++) fprintf(fout, "%d ", v[i]);
    return 0;
}