From 1416359bb4d72dbc18bc74307c7137f2680af8aa Mon Sep 17 00:00:00 2001
From: "paul.albuquer" <paul.albuquerque@hesge.ch>
Date: Mon, 18 Oct 2021 15:46:55 +0200
Subject: [PATCH] added sorting codes

---
 source_codes/sorting/heapsort.c       |  62 +++++++++++++
 source_codes/sorting/heapsort.h       |  11 +++
 source_codes/sorting/heapsort_main.c  |  38 ++++++++
 source_codes/sorting/heapsort_part.c  |  45 ++++++++++
 source_codes/sorting/quicksort.c      |  70 +++++++++++++++
 source_codes/sorting/quicksort_part.c |  99 +++++++++++++++++++++
 source_codes/sorting/tris_base.c      | 114 ++++++++++++++++++++++++
 source_codes/sorting/tris_base_part.c | 122 ++++++++++++++++++++++++++
 8 files changed, 561 insertions(+)
 create mode 100644 source_codes/sorting/heapsort.c
 create mode 100644 source_codes/sorting/heapsort.h
 create mode 100644 source_codes/sorting/heapsort_main.c
 create mode 100644 source_codes/sorting/heapsort_part.c
 create mode 100644 source_codes/sorting/quicksort.c
 create mode 100644 source_codes/sorting/quicksort_part.c
 create mode 100644 source_codes/sorting/tris_base.c
 create mode 100644 source_codes/sorting/tris_base_part.c

diff --git a/source_codes/sorting/heapsort.c b/source_codes/sorting/heapsort.c
new file mode 100644
index 0000000..d65e567
--- /dev/null
+++ b/source_codes/sorting/heapsort.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "heapsort.h"
+
+static void swap(int* a,int* b) {
+   int tmp = *a;
+   *a = *b;
+   *b = tmp;
+}
+
+static void print(int* tab,int size,char* str) {
+   for (int i=0;i<size;i++) {
+      printf("%d ",tab[i]);
+   }
+   printf("%s",str);
+}
+
+void heapsort(int* tab,int size) {
+   entassement(tab,size);
+   swap(tab,tab+size-1);
+   for (int s=size-1;s>1;s--) {
+      promotion(tab,s,0);
+      swap(tab,tab+s-1);
+   }
+}
+void entassement(int* tab,int size) {
+   for (int i=size/2-1;i>=0;i--) {
+      promotion(tab,size,i);
+   }
+}
+
+void promotion(int* tab,int size,int i) {
+   int ind_max = max3(tab,size,i);
+   if (ind_max != i) {
+      promotion(tab,size,ind_max);
+   } 
+}
+
+int max3(int* tab,int size,int i) {
+   int ind_max = i;
+   int left = fils_g(i), right = fils_d(i);
+   if (left  < size && tab[ind_max] < tab[left]) {
+      ind_max = left;
+   }
+   if (right < size && tab[ind_max] < tab[right]) {
+      ind_max = right;
+   }
+   if (i != ind_max) {
+      swap(tab+i,tab+ind_max);
+   }
+   return ind_max; 
+}
+
+int fils_g(int i) { 
+   return 2*i+1; 
+}
+
+int fils_d(int i) {
+   return 2*i+2; 
+}
+
+
diff --git a/source_codes/sorting/heapsort.h b/source_codes/sorting/heapsort.h
new file mode 100644
index 0000000..2f88d6c
--- /dev/null
+++ b/source_codes/sorting/heapsort.h
@@ -0,0 +1,11 @@
+#ifndef HEAPSORT_H
+#define HEAPSORT_H
+
+int fils_g(int i);
+int fils_d(int i);
+int max3(int* tab,int size,int i);
+void promotion(int* tab,int size,int i);
+void entassement(int* tab,int size);
+void heapsort(int* tab,int size);
+
+#endif
diff --git a/source_codes/sorting/heapsort_main.c b/source_codes/sorting/heapsort_main.c
new file mode 100644
index 0000000..a1b8cfc
--- /dev/null
+++ b/source_codes/sorting/heapsort_main.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include "heapsort.h"
+
+void rand_init(int* tab,int size,int inf,int delta);
+void print(int* tab,int size,char* str);
+
+int main(int argc, char** argv) {
+   srand(time(0));
+   int size = 10, inf = 0, delta = 20;
+   switch(argc) {
+      case 4: delta = atoi(argv[3]);
+      case 3: inf = atoi(argv[2]);     
+      case 2: size = atoi(argv[1]);
+   }
+   int* tab = (int*)malloc(size*sizeof(int));
+   rand_init(tab,size,inf,delta);
+   print(tab,size,"\n=========\n");
+   heapsort(tab,size);
+   print(tab,size,"\n=========\n");
+   return 0;
+}
+
+void print(int* tab,int size,char* str) {
+   for (int i=0;i<size;i++) {
+      printf("%d ",tab[i]);
+   }
+   printf("%s",str);
+}
+
+void rand_init(int* tab,int size,int inf,int delta) {
+   for (int i=0;i<size;i++) {
+      tab[i] = inf+rand()%delta;
+   }
+}
+
+
diff --git a/source_codes/sorting/heapsort_part.c b/source_codes/sorting/heapsort_part.c
new file mode 100644
index 0000000..a50fba7
--- /dev/null
+++ b/source_codes/sorting/heapsort_part.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "heapsort.h"
+
+static void swap(int* a,int* b) {
+   // à compléter
+}
+
+void heapsort(int* tab,int size) {
+   entassement(tab,size);
+   swap(tab,tab+size-1);
+   for (int s=size;s>1;s--) {
+      promotion(tab,s,0);
+      swap(tab,tab+s-1);
+   }
+}
+void entassement(int* tab,int size) {
+   // à compléter
+}
+
+void promotion(int* tab,int size,int i) {
+   int ind_max = max3(tab,size,i);
+   if (ind_max != i) {
+      promotion(tab,size,i);
+   } 
+}
+
+int max3(int* tab,int size,int i) {
+   int ind_max = i;
+   int left = fils_g(i), right = fils_d(i);
+   // à compléter
+   return ind_max; 
+}
+
+int fils_g(int i) { 
+   // à compléter
+   return 0;
+}
+
+int fils_d(int i) {
+   // à compléter
+   return 0; 
+}
+
+
diff --git a/source_codes/sorting/quicksort.c b/source_codes/sorting/quicksort.c
new file mode 100644
index 0000000..95943c5
--- /dev/null
+++ b/source_codes/sorting/quicksort.c
@@ -0,0 +1,70 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+
+void print(int size,int tab[size]) {
+   for (int i=0;i<size;i++) printf("%d ",tab[i]);
+}
+
+void random_tab(int size,int tab[size],int inf,int sup) {
+   assert(sup > inf);
+   for (int i=0;i<size;i++) tab[i] = inf+rand()%(sup-inf);
+}
+
+void swap(int* p_a,int* p_b) { 
+   int tmp = *p_a;
+   *p_a = *p_b;
+   *p_b = tmp;
+}
+
+int partition(int size,int array[size],int first,int last) {
+   int pivot = array[last];
+   int i = first-1,j = last;
+   while (true) {
+      do {
+         i++;
+      } while (array[i] < pivot && i<j);
+      do {
+         j--;
+      } while(array[j] > pivot && i<j);
+      if (i >= j) break;
+      swap(&array[i],&array[j]);
+   }
+   swap(&array[i],&array[last]);
+   return i;
+}
+
+void quicksort(int size,int array[size],int first,int last) {
+   if (first < last) {
+      int midpoint = partition(size,array,first,last);
+      if (first < midpoint-1) quicksort(size,array,first,midpoint-1);
+      if (midpoint+1 < last) quicksort(size,array,midpoint+1,last);
+   }
+}
+
+void test_ordre(int size,int array[size]) {
+   for (int i=0;i<size-1;i++) 
+      if (array[i] > array[i+1]) {
+         printf("erreur");
+         return;
+      }
+   printf("ok");
+}
+
+int main(int argc,char** argv) {
+   int size = atoi(argv[1]);
+   int seed = atoi(argv[2]);
+   srand(seed);
+   int* res = (int*)malloc(size*sizeof(int));
+   for (int k=0;k<20;k++) {
+      random_tab(size,res,0,100);
+      print(size,res);
+      printf("\n");
+      quicksort(size,res,0,size-1);
+      print(size,res);
+      test_ordre(size,res);
+      printf("\n================\n");
+   }
+}
+
diff --git a/source_codes/sorting/quicksort_part.c b/source_codes/sorting/quicksort_part.c
new file mode 100644
index 0000000..d7e0868
--- /dev/null
+++ b/source_codes/sorting/quicksort_part.c
@@ -0,0 +1,99 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+
+void print(int size,int tab[size]) {
+   for (int i=0;i<size;i++) {
+      printf("%d ",tab[i]);
+   }
+}
+
+void random_tab(int size,int tab[size],int inf,int sup) {
+   assert(sup > inf);
+   for (int i=0;i<size;i++) {
+      tab[i] = inf+rand()%(sup-inf);
+   }
+}
+
+void swap(int* p_a,int* p_b) { 
+   int tmp = *p_a;
+   *p_a = *p_b;
+   *p_b = tmp;
+}
+
+// Partition du tableau <array> autour d'une valeur pivot:
+// compléter le code
+int partition(int size,int array[size],int first,int last) {
+   int pivot = array[last];
+   int i = first-1,j = last;
+   while (true) {
+      // à compléter pour <i>: do {...} while (...);
+      // à compléter pour <j>: do {...} while (...);
+      if (i >= j) {
+         break;
+      }
+      // à compléter: échanger cases <i> et <j> du tableau <array>
+   }
+   // à compléter: échanger cases <i> et <last> du tableau <array>
+   return i;
+}
+
+// Tri rapide récursif
+void quicksort(int size,int array[size],int first,int last) {
+   if (first < last) {
+      int midpoint = partition(size,array,first,last);
+      if (first < midpoint-1) {
+         quicksort(size,array,first,midpoint-1);
+      }
+      if (midpoint+1 < last) {
+         quicksort(size,array,midpoint+1,last);
+      }
+   }
+}
+
+// Test si le tableau <array> est ordonné croissant
+void test_ordre(int size,int array[size]) {
+   for (int i=0;i<size-1;i++) { 
+      if (array[i] > array[i+1]) {
+         printf("erreur");
+         return;
+      }
+   }
+   printf("ok");
+}
+
+int main(int argc,char** argv) {
+   int size = atoi(argv[1]);
+   int seed = atoi(argv[2]);
+   srand(seed);
+   int* res = (int*)malloc(size*sizeof(int));
+   for (int k=0;k<20;k++) {
+      random_tab(size,res,0,100);
+      print(size,res);
+      printf("\n");
+      quicksort(size,res,0,size-1);
+      print(size,res);
+      test_ordre(size,res);
+      printf("\n================\n");
+   }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source_codes/sorting/tris_base.c b/source_codes/sorting/tris_base.c
new file mode 100644
index 0000000..dfbd099
--- /dev/null
+++ b/source_codes/sorting/tris_base.c
@@ -0,0 +1,114 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void print(int size,int tab[size]);
+void random_tab(int size,int tab[size]);
+void tri_insertion(int size,int tab[size]);
+void tri_bulle(int size,int tab[size]);
+void tri_selection(int size,int tab[size]);
+
+void main(int argc,char** argv) {
+   if (argc != 4) {
+      printf("usage: program <size> <seed> <sorting_algo_number>\n");
+      exit(EXIT_FAILURE);
+   }
+   int size = atoi(argv[1]);
+   int seed = atoi(argv[2]);
+   int choix = atoi(argv[3]);
+   srand(seed);
+   int res[size];
+   random_tab(size,res);
+   print(size,res);
+   printf("\n");
+   switch(choix) {
+      case 1: tri_bulle(size,res); break;
+      case 2: tri_selection(size,res); break;
+      case 3: tri_insertion(size,res); break;
+      default: printf("Choix non available\n");
+   }
+   print(size,res);
+   printf("\n");
+}
+
+void print(int size,int tab[size]) {
+   for (int i=0;i<size;i++) {
+      printf("%d ",tab[i]);
+   }
+}
+
+void random_tab(int size,int tab[size]) {
+   for (int i=0;i<size;i++) {
+      tab[i] = -50+rand()%100;
+   }
+}
+
+void shift(int size,int tab[size],int pos) { 
+   for (int i=size-1;i>pos;i--) {
+      tab[i] = tab[i-1];
+   }
+}
+
+void tri_insertion_step(int sz,int tab[sz],int pos) {
+   int tmp = tab[sz-1];
+   shift(sz,tab,pos);
+   tab[pos] = tmp;
+}    
+
+int position(int size,int tab[size],int val) {
+   int pos = 0;
+   while (pos < size && val > tab[pos]) {
+      pos ++;
+   }
+   return pos;
+}
+
+void tri_insertion(int size,int tab[size]) {
+   for (int i=1;i<size;i++) {
+      int pos = position(i+1,tab,tab[i]);
+      tri_insertion_step(i+1,tab,pos);
+   }
+}
+
+void swap(int* p_a,int* p_b) { 
+   int tmp = *p_a;
+   *p_a = *p_b;
+   *p_b = tmp;
+}
+
+void tri_bulle_step(int size,int tab[size]) {
+   for (int i=0;i<size-1;i++) {
+      if (tab[i] > tab[i+1]) {
+         swap(&tab[i],&tab[i+1]);
+      }
+   }
+}    
+
+void tri_bulle(int size,int tab[size]) {
+   for (int sz=size;sz>=2;sz--) {
+      tri_bulle_step(sz,tab);
+   }
+}    
+
+int index_min(int size,int tab[size],int i) {
+   int ind_min = i;
+   for (int k=i+1;k<size;k++) {
+      if (tab[k] < tab[ind_min]) {
+         ind_min = k;
+      }
+   }
+   return ind_min;
+}
+
+void tri_selection_step(int size,int tab[size],int i) {
+   int ind_min = index_min(size,tab,i);
+   if (tab[i] != tab[ind_min]) {
+      swap(&tab[i],&tab[ind_min]);
+   }
+}    
+
+void tri_selection(int size,int tab[size]) {
+   for (int i=0;i<size-1;i++) {
+      tri_selection_step(size,tab,i);
+   }
+}   
+
diff --git a/source_codes/sorting/tris_base_part.c b/source_codes/sorting/tris_base_part.c
new file mode 100644
index 0000000..f41a20e
--- /dev/null
+++ b/source_codes/sorting/tris_base_part.c
@@ -0,0 +1,122 @@
+#include <stdio.h>
+#include <stdlib.h>
+  
+// Tri par insertion
+void tri_insertion(int size,int tab[size]);
+// Tri à bulle
+void tri_bulle(int size,int tab[size]);
+// Tri par sélection
+void tri_selection(int size,int tab[size]);
+// Utilitaires
+void print(int size,int tab[size]);
+void random_tab(int size,int tab[size]);
+
+int main(int argc,char** argv) {
+   if (argc != 4) {
+      printf("usage: program <size> <seed> <sorting_algo_number>\n");
+      exit(EXIT_FAILURE);
+   }
+   int size = atoi(argv[1]);
+   int seed = atoi(argv[2]);
+   int choix = atoi(argv[3]);
+   srand(seed);
+   int res[size];
+   random_tab(size,res);
+   print(size,res);
+   printf("\n");
+   switch(choix) {
+      case 1: tri_bulle(size,res); break;
+      case 2: tri_selection(size,res); break;
+      case 3: tri_insertion(size,res); break;
+      default: printf("Choix non available\n");
+   }
+   print(size,res);
+   printf("\n");
+   return EXIT_SUCCESS;
+}
+
+int position(int size,int tab[size],int val) {
+   int pos = 0;
+   while (pos < size && val > tab[pos]) {
+      pos++;
+   }
+   return pos;
+}
+
+void shift(int size,int tab[size],int pos) { 
+   // à compléter
+}
+
+void tri_insertion_step(int sz,int tab[sz],int pos) {
+   int tmp = tab[sz-1];
+   shift(sz,tab,pos);
+   tab[pos] = tmp;
+}
+
+// Tri par insertion
+void tri_insertion(int size,int tab[size]) {
+   // à compléter
+} 
+
+void swap(int* p_a,int* p_b) { 
+   int tmp = *p_a;
+   *p_a = *p_b;
+   *p_b = tmp;
+}
+
+void tri_bulle_step(int size,int tab[size]) {
+   for (int i=0;i<size-1;i++) {
+      if (tab[i] > tab[i+1]) {
+         swap(&tab[i],&tab[i+1]);
+      }
+   }
+}    
+
+// Tri à bulle
+void tri_bulle(int size,int tab[size]) {
+   for (int sz=size;sz>=2;sz--) {
+      tri_bulle_step(sz,tab);
+   }
+}    
+
+int index_min(int size,int tab[size],int i) {
+   int ind_min = i;
+   for (int k=i+1;k<size;k++) {
+      if (tab[k] < tab[ind_min]) {
+         ind_min = k;
+      }
+   }
+   return ind_min;
+}
+
+void tri_selection_step(int size,int tab[size],int i) {
+   // à compléter
+}    
+
+// Tri par sélection
+void tri_selection(int size,int tab[size]) {
+   // à compléter
+}   
+
+void print(int size,int tab[size]) {
+   for (int i=0;i<size;i++) {
+      printf("%d ",tab[i]);
+   }
+}
+
+void random_tab(int size,int tab[size]) {
+   for (int i=0;i<size;i++) {
+      tab[i] = -50+rand()%100;
+   }
+}
+
+
+
+
+
+
+
+
+
+
+
-- 
GitLab