From 80bc756868d2c415727a4ee6b3fd4e9c344a91c7 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Mon, 11 Nov 2024 15:44:19 +0100 Subject: [PATCH] added quicksort --- slides/exemples/quicksort.c | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 slides/exemples/quicksort.c diff --git a/slides/exemples/quicksort.c b/slides/exemples/quicksort.c new file mode 100644 index 0000000..0ecc3c4 --- /dev/null +++ b/slides/exemples/quicksort.c @@ -0,0 +1,61 @@ +#include <stdlib.h> +#include <stdio.h> + +void print_tab(int size, int tab[size]) { + for (int i = 0; i < size; ++i) { + printf("%d ", tab[i]); + } + printf("\n"); +} + +void swap(int *lhs, int *rhs) { + int tmp = *lhs; + *lhs = *rhs; + *rhs = tmp; +} + +int partition(int tab[], int ind_min, int ind_max) { + // ind_min == 0 + // ind_max == 6 + int pivot = tab[ind_max]; // 12 + int i = ind_min - 1; // 0 + int j = ind_max; // 6 + while (i < j) { + do { + i += 1; // 0, tab[0] == 1 < 12 + } while (tab[i] < pivot && i < j); + do { + j -= 1; // j == 5, tab[5] < 12 + } while (tab[j] > pivot && i < j); + if (i < j) { + swap(&tab[i], &tab[j]); + } + } + swap(&tab[i], &tab[ind_max]); + + return i; +} + +void quicksort(int tab[], int ind_min, int ind_max) { + int size = ind_max - ind_min + 1; + if (size > 1) { + int ind_pivot = partition(tab, ind_min, ind_max); + if (ind_pivot - ind_min > 0) { + quicksort(tab, ind_min, ind_pivot - 1); + } + if (ind_max - ind_pivot > 0) { + quicksort(tab, ind_pivot + 1, ind_max); + } + } +} + +int main(int argc, char *argv[]) { + int size = argc - 1; + int tab[size]; + for (int i = 0; i < size; ++i) { + tab[i] = atoi(argv[i + 1]); + } + print_tab(size, tab); + quicksort(tab, 0, size - 1); + print_tab(size, tab); +} -- GitLab