Skip to content
Snippets Groups Projects
triFusion.c 2.84 KiB
Newer Older
Mickael Da Silva's avatar
Mickael Da Silva committed
#include "triFusion.h"

void sousTriFusion(long * A, size_t p, size_t r){
chafiol's avatar
chafiol committed
    if (p + 1 < r) {
        size_t q = (size_t)((p + r) / 2);
Mickael Da Silva's avatar
Mickael Da Silva committed
        sousTriFusion(A, p, q);
        sousTriFusion(A, q, r);
        fusion(A, p, q, r);
    }
}

void fusion(long * A, size_t p, size_t q, size_t r){
    size_t n1 = q-p;
    size_t n2 = r-q;

chafiol's avatar
chafiol committed
    long Ag[n1];
Mickael Da Silva's avatar
Mickael Da Silva committed
    long Ad[n2];
chafiol's avatar
chafiol committed
    // memset(Ag, 0, n1);
    // memset(Ad, 0, n2);
Mickael Da Silva's avatar
Mickael Da Silva committed
    int j =0;
chafiol's avatar
chafiol committed
    for(size_t i = p; i<q; i++){
        Ag[j] = A[i];
Mickael Da Silva's avatar
Mickael Da Silva committed
        j++;
    }
    j =0;
chafiol's avatar
chafiol committed
    for(size_t i = q; i<r; i++){
        Ad[j] = A[i];
Mickael Da Silva's avatar
Mickael Da Silva committed
        j++;
    }

    size_t indg = 0;
    size_t indd = 0;
    size_t i = p;
    while (i < r){
        if(indg == n1){
            A[i] = Ad[indd];
            indd++;
        }
        else if(indd == n2){
            A[i] == Ag[indg];
            indg++;
        }
        else if(Ag[indg] < Ad[indd]){
            A[i] = Ag[indg];
            indg++;
        }
        else{
            A[i] = Ad[indd];
            indd++;
        }
        i++;
    }
}

chafiol's avatar
chafiol committed


Mickael Da Silva's avatar
Mickael Da Silva committed
void triFusion(long * A, size_t n){
    sousTriFusion(A, 0, n);
Mickael Da Silva's avatar
Mickael Da Silva committed
}

// --------------------------------------------------------

void sousTriFusionVerbose(long * A, size_t p, size_t r, struct data* d){
    if(p<(r-1)){
        d->comparison++;
        size_t q = (size_t)((p+r)/2);
        d->write++;
        sousTriFusionVerbose(A, p, q,d);
        sousTriFusionVerbose(A, q, r, d);
        fusionVerbose(A, p, q, r, d);
    }
}

void fusionVerbose(long * A, size_t p, size_t q, size_t r, struct data* d){
    size_t n1 = q-p;
    d->write++;
    size_t n2 = r-q;
    d->write++;

    long Ad[n2];
    memset(Ad, 0, n2);
    d->write+=n2;
    int j = 0;
    for(size_t i = q; i<r; i++){
        Ad[j] = A[i];
        d->write++;
        j++;
        d->write++;
    }

    long Ag[n1];
    memset(Ag, 0, n1);
    d->write+=n1;
    j = 0;
    for(size_t i = p; i<q; i++){
        Ag[j] = A[i];
        d->write++;
        j++;
        d->write++;
    }

    size_t indg = 0;
    size_t indd = 0;
    size_t i = p;
    d->write++;
    while (i < r){
        d->comparison++;
        if(indg == n1){
            d->comparison++;
            A[i] = Ad[indd];
            d->write++;
            indd++;
            d->write++;
        }
        else if(indd == n2){
            d->comparison+=2;
            A[i] == Ag[indg];
            d->write++;
            indg++;
            d->write++;
        }
        else if(Ag[indg] < Ad[indd]){
            d->comparison+=3;
            A[i] = Ag[indg];
            d->write++;
            indg++;
            d->write++;
        }
        else{
            d->comparison+=4;
            A[i] = Ad[indd];
            d->write++;
            indd++;
            d->write++;
        }
        i++;
        d->write++;
    }
}

void triFusionVerbose(long * A, size_t n, struct data* d){
    sousTriFusionVerbose(A, 0, n, d);
Mickael Da Silva's avatar
Mickael Da Silva committed
}