Cod sursa(job #1000299)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 22 septembrie 2013 16:47:01
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
using namespace std;
#define N 500001

int a[N], b[N],n;

void merge(int a[], int left, int right) {
    /// ai a[left...right] si stii ca a[left..middle] si
    // a[middle + 1, right] sunt sortate si tu trebuie sa sortezi a[left...right]
    int middle = (left + right) / 2;
    int i, j, k = left - 1;
    for (i = left, j = middle + 1; i <= middle && j <= right; )
        if (a[i] < a[j]) // adaugam pe a[i]
            b[++k] = a[i++];
        else
            b[++k] = a[j++];//!!!!!!!!!!!!! ce-i aici? era b[++k]=b[j++]!!!
    // acum mai pot ramane unele elemente
    // de ex daca ai [1, 2, 3] si [4, 5, 6] primele se iau alea din primul sir
    // deci iti raman 4 5 6 pe care trebuie sa le adaugi
    for (; i <= middle; ++i)
        b[++k] = a[i];
    for (; j <= right; ++j)
        b[++k] = a[j];

    // si acum le mutam la loc din b in a
    for (i = left; i <= right; ++i)//de ce mai plusezi si j-ul?
        a[i] = b[i];// initial aveam in b de la 1 la ... si aveam a[i] = b[j]
        
}

void sortare(int a[], int left, int right) {
    if(left >= right)// :| ?:)), da, aveam impresia ca e nefolositor in cazul asta
//same shit:))
        return;
    //declara middle
    //asta vroiam:))
    int middle = (right + left) / 2;
    sortare(a, left, middle);
    sortare(a, middle + 1, right);
    // ai apelat recursiv, iar cand revii stii ca cele 2 subvectori sunt sortati
    // deci trebuie sa ii interclasezi
    merge(a, left, right);
}

//testeaza
int main(){
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    scanf("%d ", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d ", &a[i]);
    sortare(a, 1, n);
    for(int i = 1; i <= n; ++i)
        printf("%d ", a[i]);
    printf("\n");
}
// pune fisierele si trimite
 //dar stai ca nu le sorteaza nu? pai nu asta vroiam sa-ti arat
 // mda... :)) acum pune fisiere si trimite