Skip to content
Snippets Groups Projects
Commit 991104a4 authored by SCHMIDT LUCAS's avatar SCHMIDT LUCAS
Browse files

Ajout du compte des comparaisons et des écritures pour tri fusion et tri rapide.

parent 02488b6f
Branches
No related merge requests found
......@@ -2,5 +2,8 @@
triFusion
triInsertion
triRapide
triFusionCompte
triInsertionCompte
triRapideCompte
main
*.gch
all: main triFusion triInsertion triRapide
all: main triFusion triInsertion triRapide triFusion triFusionCompte triRapideCompte
main: main.c tris.o utils.o
gcc -Wall -o $@ $^
......@@ -6,5 +6,5 @@ main: main.c tris.o utils.o
%.o: %.c
gcc -Wall -c $^
%: %.c
%: %.c utils.o
gcc -Wall -o $@ $^
#include <stdio.h>
#include <stdlib.h>
#include "utils.h"
void fusion(long* A,size_t p,size_t q,size_t r,struct compte* c){
size_t n1 = q-p;
size_t n2 = r-q;
long* Ag = malloc(n1*sizeof(long));
long* Ad = malloc(n2*sizeof(long));
copierTableau(Ag,A+p,n1);
copierTableau(Ad,A+q,n2);
c->ecrit += n1+n2;
size_t indG = 0;
size_t indD = 0;
size_t i = p;
while(comparer(i,"<",r,c)/*i < r*/){
if(comparer(indG,"==",n1,c)/*indG == n1*/){
//A[i] = Ad[indD];
ecrire(A+i,Ad[indD],c);
indD++;
}else if(comparer(indD,"==",n2,c)/*indD == n2*/){
//A[i] = Ag[indG];
ecrire(A+i,Ag[indG],c);
indG++;
}else if(comparer(Ag[indG],"<",Ad[indD],c)/*Ag[indG] < Ad[indD]*/){
//A[i] = Ag[indG];
ecrire(A+i,Ag[indG],c);
indG++;
}else{
//A[i] = Ad[indD];
ecrire(A+i,Ad[indD],c);
indD++;
}
i++;
}
free(Ad);
free(Ag);
}
void sousTriFusion(long* A,size_t p,size_t r,struct compte* c){
if(/*comparer(p+1,"<",r,c)*/p+1 < r){
size_t q = (p+r)/2;
sousTriFusion(A,p,q,c);
sousTriFusion(A,q,r,c);
fusion(A,p,q,r,c);
}
}
void triFusion(long* A,size_t n,struct compte* c){
sousTriFusion(A,0,n,c);
}
int main(int argc,char** argv){
long* A = malloc((argc-1)*sizeof(long));
for(size_t i = 0;i < argc-1;i++){
A[i] = atol(argv[i+1]);
}
struct compte c;
initCompte(&c);
printf("Tableau d'entrée: ");
printTab(A,argc-1);
triFusion(A,argc-1,&c);
printf("Tableau de sortie: ");
printTab(A,argc-1);
printf("Comparaisons: %lu\nEcritures: %lu\n",c.comp,c.ecrit);
free(A);
}
#include <stdio.h>
#include <stdlib.h>
#include "utils.h"
size_t partition(long* A,size_t p,size_t r,struct compte* c){
long pivot = A[r-1];
size_t i = p;
for(size_t j = p;j < r-1;j++){
if(comparer(A[j],"<=",pivot,c)/*A[j] <= pivot*/){
permuter(A+i,A+j);
c->ecrit += 3;
i++;
}
}
permuter(A+i,A+r-1);
c->ecrit += 3;
return i;
}
void sousTriRapide(long* A,size_t p,size_t r,struct compte* c){
if(/*comparer(p+1,"<",r,c)*/p+1 < r){
size_t q = partition(A,p,r,c);
sousTriRapide(A,p,q,c);
sousTriRapide(A,q+1,r,c);
}
}
void triRapide(long* A,size_t n,struct compte* c){
sousTriRapide(A,0,n,c);
}
int main(int argc,char** argv){
long* A = malloc((argc-1)*sizeof(long));
for(size_t i = 0;i < argc-1;i++){
A[i] = atol(argv[i+1]);
}
struct compte c;
initCompte(&c);
printf("Tableau d'entrée: ");
printTab(A,argc-1);
triRapide(A,argc-1,&c);
printf("Tableau de sortie: ");
printTab(A,argc-1);
printf("Comparaisons: %lu\nEcritures: %lu\n",c.comp,c.ecrit);
free(A);
}
......@@ -45,7 +45,7 @@ char comparer(long a,char* op,long b,struct compte* c){
return 0;
}
void ecriture(long* a,long b,struct compte* c){
void ecrire(long* a,long b,struct compte* c){
c->ecrit++;
*a = b;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
struct compte{
size_t comp;
size_t ecrit;
}
};
void copierTableau(long* dest,long* src,size_t n);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment