Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Showing
with 471 additions and 0 deletions
#include "triBulle.h"
void triBulle(long* A, size_t n){
for(int I = n - 2;I >= 0; I--) {
for(int J = 0; J <= I; J++) {
if(A[J + 1] < A[J]) {
int t = A[J + 1];
A[J + 1] = A[J];
A[J] = t;
}
}
}
}
\ No newline at end of file
#ifndef triBulle_h
#define triBulle_h
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "../Lib/utils.h"
void triBulle(long* A, size_t n);
#endif
\ No newline at end of file
#include "triFusion.h"
void sousTriFusion(long* A, const size_t p, const size_t r) {
if (p + 1 < r) {
size_t q = (size_t)((p + r) / 2);
sousTriFusion(A, p, q);
sousTriFusion(A, q, r);
fusion(A, p, q, r);
}
}
void fusion(long* A, const size_t p, const size_t q, const size_t r) {
size_t n1 = q - p;
size_t n2 = r - q;
long* Ag = (long*) malloc(n1 * sizeof(long));
long* Ad = (long*) malloc(n2 * sizeof(long));
size_t cursor = 0;
for (size_t i = p; i < q; i++) {
Ag[cursor++] = A[i];
}
cursor = 0;
for (size_t i = q; i < r; i++) {
Ad[cursor++] = A[i];
}
size_t ind_g = 0;
size_t ind_d = 0;
size_t i = p;
while (i < r) {
if (ind_g == n1) {
A[i] = Ad[ind_d++];
}
else if (ind_d == n2) {
A[i] = Ag[ind_g++];
}
else if (Ag[ind_g] < Ad[ind_d]) {
A[i] = Ag[ind_g++];
}
else {
A[i] = Ad[ind_d++];
}
i++;
}
}
void triFusion(long * A, size_t n){
sousTriFusion(A, 0, n);
}
// --------------------------------------------------------
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);
}
\ No newline at end of file
#ifndef triFusion_h
#define triFusion_h
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "../Lib/utils.h"
void sousTriFusion(long * A, size_t p, size_t r);
void fusion(long * A, size_t p, size_t q, size_t r);
void triFusion(long * A, size_t n);
void sousTriFusionVerbose(long * A, size_t p, size_t r, struct data* d);
void fusionVerbose(long * A, size_t p, size_t q, size_t r, struct data* d);
void triFusionVerbose(long * A, size_t n, struct data* d);
#endif
\ No newline at end of file
#include "triInsertion.h"
void triInsertion(long* A, size_t n){
long cle = 0;
size_t i =0;
for(i = 1; i<n; i++){
cle=A[i];
size_t j = i - 1;
while (j+1 > 0 && A[j] > cle ){
A[j+1] = A[j];
j = j-1;
}
A[j+1] = cle;
}
}
// --------------------------------------------------------
void triInsertionVerbose(long* A, size_t n, struct data* d){
long cle = 0;
d->write++;
for(size_t i = 1; i<n; i++){
cle=A[i];
d->write++;
size_t j = i - 1;
d->write++;
while (j+1 > 0 && A[j] > cle ){
d->comparison+=2;
A[j+1] = A[j];
d->write++;
j = j-1;
d->write++;
}
A[j+1] = cle;
d->write++;
}
}
\ No newline at end of file
#ifndef triInsertion_h
#define triInsertion_h
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "../Lib/utils.h"
void triInsertion(long* A, size_t n);
void triInsertionVerbose(long* A, size_t n, struct data* d);
#endif
\ No newline at end of file
#include "triRapide.h"
void sousTriRapide(long* A, size_t p, size_t r) {
size_t max = 0; max--;
if(r-1 != max){
if (p<(r-1)) {
size_t q = partition(A, p, r);
sousTriRapide(A, p, q);
sousTriRapide(A, q+1, r);
}
}
}
size_t partition(long* A, size_t p, size_t r) {
long pivot = A[r-1];
size_t i = p;
for (size_t j = p; j <= r-2; j++) {
if (A[j] <= pivot) {
long temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
}
}
long temp = A[i];
A[i] = A[r-1];
A[r-1] = temp;
return i;
}
void triRapide(long* A, size_t n) {
sousTriRapide(A, 0, n);
}
// --------------------------------------------------------
void sousTriRapideVerbose(long* A, size_t p, size_t r, struct data* d) {
size_t max = 0; max--;
d->write++;
if(r-1 != max){
d->comparison++;
if (p<(r-1)) {
d->comparison++;
size_t q = partitionVerbose(A, p, r, d);
d->write++;
sousTriRapideVerbose(A, p, q, d);
sousTriRapideVerbose(A, q+1, r, d);
}
}
}
size_t partitionVerbose(long* A, size_t p, size_t r, struct data* d) {
long pivot = A[r-1];
d->write++;
size_t i = p;
d->write++;
for (size_t j = p; j <= r-2; j++) {
if (A[j] <= pivot) {
d->comparison++;
long temp = A[i];
d->write++;
A[i] = A[j];
d->write++;
A[j] = temp;
d->write++;
i++;
d->write++;
}
}
long temp = A[i];
d->write++;
A[i] = A[r-1];
d->write++;
A[r-1] = temp;
d->write++;
return i;
}
void triRapideVerbose(long* A, size_t n, struct data* d) {
sousTriRapideVerbose(A, 0, n, d);
}
\ No newline at end of file
#ifndef triRapide_h
#define triRapide_h
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "../Lib/utils.h"
void triRapide(long* A, size_t n);
size_t partition(long* A, size_t p, size_t r);
void sousTriRapide(long* A, size_t p, size_t r);
void triRapideVerbose(long* A, size_t n, struct data* d);
size_t partitionVerbose(long* A, size_t p, size_t r, struct data* d);
void sousTriRapideVerbose(long* A, size_t p, size_t r, struct data* d);
#endif
\ No newline at end of file
#include "triRapideInsertion.h"
#include "triInsertion.h"
void sousTriRapideInsertion(long* A, size_t p, size_t r) {
size_t max = 0; max--;
if(r-1 != max){
if (p<(r-1)) {
if(r-p<100){
triInsertion(A, r-p);
}
else
{
size_t q = partition_wInsertion(A, p, r);
sousTriRapideInsertion(A, p, q);
sousTriRapideInsertion(A, q+1, r);
}
}
}
}
size_t partition_wInsertion(long* A, size_t p, size_t r) {
long pivot = A[r-1];
size_t i = p;
for (size_t j = p; j <= r-2; j++) {
if (A[j] <= pivot) {
long temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
}
}
long temp = A[i];
A[i] = A[r-1];
A[r-1] = temp;
return i;
}
void triRapideInsertion(long* A, size_t n) {
sousTriRapideInsertion(A, 0, n);
}
\ No newline at end of file
#ifndef triRapideInsertion_h
#define triRapideInsertion_h
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "../Lib/utils.h"
void triRapideInsertion(long* A, size_t n);
size_t partition_wInsertion(long* A, size_t p, size_t r);
void sousTriRapideInsertion(long* A, size_t p, size_t r) ;
#endif
\ No newline at end of file
all: tri
tri: Lib/main.c Tris/triBulle.o Tris/triInsertion.o Tris/triFusion.o Tris/triRapide.o Tris/triRapideInsertion.o Lib/utils.o
gcc -Wall Lib/main.c Tris/triInsertion.o Tris/triFusion.o Tris/triBulle.o Tris/triRapide.o Tris/triRapideInsertion.o Lib/utils.o -Wall -o tri
insertion: Tris/triInsertion.c Tris/triInsertion.h
gcc -c Tris/triInsertion.c Tris/triInsertion.h -Wall
bulle: Tris/triBulle.c Tris/triBulle.h
gcc -c Tris/triBulle.c Tris/triBulle.h -Wall
fusion: Tris/triFusion.c Tris/triFusion.h
gcc -c Tris/triFusion.c Tris/triFusion.h -Wall
rapide: Tris/triRapide.c Tris/triRapide.h
gcc -c Tris/triRapide.c Tris/triRapide.h -Wall
rapideInsertion: Tris/triRapideInsertion.c Tris/triRapideInsertion.h
gcc -c Tris/triRapideInsertion.c Tris/triRapideInsertion.h -Wall
utils: Lib/utils.c Lib/utils.h
gcc -c Lib/utils.c Lib/utils.h -Wall
clear:
rm Tris/*.o
\ No newline at end of file
# Manuel
Pour utiliser les tris, vous avez besoin de 2 choses:<br>
- Le binaire `tri`<br>
- Un document texte contenant les éléments du tableau, chaque élément est séparé du prochain par un espace et pour finit par un `.`. <br>
Ex : `4 3 11 29 .`<br>
Le binaire demande une option et un fichier, le fichier est du type de ceux définit plus haut, quant aux option il en existe plusieures : <br>
- `-i` ou `--insertion` pour le tri à insertion<br>
- `-f` ou `--fusion` pour le tri à fusion<br>
- `-r` ou `--rapide` pour le tri rapide<br>
- `-a` ou `--all` pour tout les tris disponibles <br>
\ No newline at end of file
40 47 12 2 25 3 14 65 48 10 1 56 94 45 36 27 6 7 19 16 24 38 37 11 78 5 18 54 20 21 82 42 32 22 19 9 53 41 99 125 111 248 33 .
\ No newline at end of file
This diff is collapsed.
3 6 7 5 3 5 6 2 9 1 .
40 47 12 2 25 3 14 65 48 10 1 56 94 45 36 27 6 7 19 16 24 38 37 11 .
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.