diff --git a/TP2/Makefile b/TP2/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4ef68c03f7953ab2723c38e05c9466be1a6040f7 --- /dev/null +++ b/TP2/Makefile @@ -0,0 +1,12 @@ +all: main + +main : tris.o utils.o main.c + gcc -o main -Wall utils.o tris.o -g main.c + +tris.o : tris.c tris.h + gcc -c -Wall -g tris.c + +utils.o : utils.c utils.h + gcc -o utils.o -c -g utils.c +clean : + rm *.o diff --git a/TP2/main b/TP2/main new file mode 100755 index 0000000000000000000000000000000000000000..4bcea08537181edf148e3c95d4cc01c68c08e7ef Binary files /dev/null and b/TP2/main differ diff --git a/TP2/main.c b/TP2/main.c new file mode 100644 index 0000000000000000000000000000000000000000..c9c57bbff3d58a7349d03e767b597041fa090772 --- /dev/null +++ b/TP2/main.c @@ -0,0 +1,47 @@ +#include <stdio.h> +#include <stdlib.h> +#include "tris.h" +#include "utils.h" + +int main(int argc, char *argv[]) { + if(argc != 4) { + printf("Usage: %s [typeAlgo]Â [taille] [isAfficher]\n", argv[0]); + exit(1); + } + + char typeAlgo = argv[1][0]; + long taille = (long) atoi(argv[2]); + long MAX = 50; + long tab[taille]; + size_t afficher = (size_t) atoi(argv[3]); + + genTab(tab, taille, MAX); + + switch(typeAlgo) { + case 'i': + printf("Tri Insertion: \n"); + triInsertion(tab,taille); + + if(afficher) + affichertab(tab,taille); + break; + + case 'r': + printf("Tri Rapide: \n"); + triRapide(tab, taille); + + if(afficher) + affichertab(tab,taille); + break; + + case 'f': + printf("Tri Fusion: \n"); + triFusion(tab, taille); + + if(afficher) + affichertab(tab,taille); + break; + } + + return 0; +} diff --git a/TP2/test.sh b/TP2/test.sh new file mode 100644 index 0000000000000000000000000000000000000000..6fbf71901ae77d35b32825602caeef21f16f165c --- /dev/null +++ b/TP2/test.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +algo = "insertion" +taille = 10000 + +for iTest in 'seq 1 100' +do + res = (/usr/bin/time -f "%U\t%M" ./main $algo $taille) + echo -e "$iTest\t$taille\t$res" +done diff --git a/TP2/tris.c b/TP2/tris.c new file mode 100644 index 0000000000000000000000000000000000000000..d3df80cbcad7dabaddc3cb3300a1f62e1b07dd95 --- /dev/null +++ b/TP2/tris.c @@ -0,0 +1,105 @@ +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include "tris.h" + +void triInsertion(long* A, size_t n) { + for(size_t i = 1; i <= n-1; i++){ + long cle = A[i]; + size_t j = i - 1; + while(j+1 >= j && A[j] > cle){ + A[j+1] = A[j]; + j = j-1; + } + A[j+1] = cle; + } +} + +void triFusion(long* A, size_t size) { + sousTriFusion(A, 0, size); +} + +void sousTriFusion(long* A, size_t first, size_t size) { + if(first+1 <size){ // p < r - 1 + size_t middle = floor((first+size)/2); + sousTriFusion(A, first, middle); + sousTriFusion(A, middle, size); + fusion(A, first, middle, size); + } +} + +void copySousTable(long* mainT, long* underT, size_t id, size_t size) { + for(size_t i = id; i < id+size; ++i) { + underT[i-id] = mainT[i]; + } +} + +void fusion(long* A, size_t first, size_t middle, size_t size) { + size_t n1 = middle - first; // Nb elem dans A[p , q] q exclu + size_t n2 = size - middle; // Nb elem dans A[q , r] r exclu + + size_t indg = 0; + size_t indd = 0; + + long* ag = malloc(sizeof(long) * n1); + long* ad = malloc(sizeof(long) * n2); + + copySousTable(A, ag, first, n1); + copySousTable(A, ad, middle, n2); + + int i = first; + + while(i < size) { + 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; + } + + free(ag); + free(ad); +} + +void triRapide(long* A, size_t n) { + sousTriRapide(A,0,n); +} + +void sousTriRapide(long* A, size_t first, size_t size){ + if(first+1 < size){ + size_t middle = partition(A,first,size); + sousTriRapide(A,first,middle); + sousTriRapide(A,middle+1,size); + } +} + +size_t partition(long* A, size_t first, size_t size) { + long pivot = A[size-1]; + size_t i = first; + for(int j = first; j+2 <= size; j++){ + if(A[j] <= pivot){ + permuter(A,i,j); + i++; + } + } + permuter(A,i,size-1); + return i; +} + +void permuter(long* A,size_t i,size_t j) { + long inter = A[i]; + A[i] = A[j]; + A[j] = inter; +} diff --git a/TP2/tris.h b/TP2/tris.h new file mode 100644 index 0000000000000000000000000000000000000000..9841ffb6e67d3ae291493953eb6087b81d284159 --- /dev/null +++ b/TP2/tris.h @@ -0,0 +1,17 @@ +#ifndef TRIS_H +#define TRIS_H +#include <stdint.h> +#include <stdlib.h> + +void triInsertion(long* A, size_t n); + +void triFusion(long* A, size_t size); +void sousTriFusion(long* A, size_t first, size_t size); +void fusion(long* A, size_t first, size_t middle, size_t size); + +void triRapide(long* A, size_t n); +void sousTriRapide(long* A, size_t first, size_t size); +size_t partition(long* A, size_t first, size_t size); +void permuter(long* A,size_t i,size_t j); + +#endif //TRIS_H diff --git a/TP2/tris.o b/TP2/tris.o new file mode 100644 index 0000000000000000000000000000000000000000..feb455293f158d5d0ad902bbc1189c5183749779 Binary files /dev/null and b/TP2/tris.o differ diff --git a/TP2/utils.c b/TP2/utils.c new file mode 100644 index 0000000000000000000000000000000000000000..bd523d7bbe4e9a88b62a07f2ef00106b81352ec5 --- /dev/null +++ b/TP2/utils.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include <stdlib.h> +#include "utils.h" + +void affichertab(long* T, int s){ + printf("[ "); + for(int i = 0; i < s-1; i++){ + printf("%d , ",T[i]); + } + printf("%d ]\n",T[s-1]); +} + +void genTab(long* T, long taille, long MAX) { + // Generer le tableau + for(long i = 0; i < taille; ++i) { + T[i] = rand() % MAX; + } +} diff --git a/TP2/utils.h b/TP2/utils.h new file mode 100644 index 0000000000000000000000000000000000000000..0c016ab825d0f621678a3aabcaf2a997a62a02c8 --- /dev/null +++ b/TP2/utils.h @@ -0,0 +1,5 @@ +#include <stdio.h> +#include <stdlib.h> + +void affichertab(long* T, int s); +void genTab(long* T, long taille, long MAX); diff --git a/TP2/utils.o b/TP2/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..2408e3a0b5ba8709487bf1b2022345b78b83b3d0 Binary files /dev/null and b/TP2/utils.o differ