aboutsummaryrefslogtreecommitdiff
path: root/src/algo
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-10 03:58:29 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-10 03:58:29 +0100
commit4800d3ca472058f0161970aa55c6debb453e5d00 (patch)
treedefbbeb8484769322c93c0898a9d6dac15a4598a /src/algo
parent48f43e34e9beafbc76a85c6f6874aae051981c72 (diff)
downloadlibft-4800d3ca472058f0161970aa55c6debb453e5d00.tar.gz
libft-4800d3ca472058f0161970aa55c6debb453e5d00.tar.bz2
libft-4800d3ca472058f0161970aa55c6debb453e5d00.zip
Fixing merge compilation error, Added ft_mergesort
Diffstat (limited to 'src/algo')
-rw-r--r--src/algo/ft_heapsort.c50
-rw-r--r--src/algo/ft_is_set.c5
-rw-r--r--src/algo/ft_mergesort.c65
-rw-r--r--src/algo/ft_qsort.c4
4 files changed, 120 insertions, 4 deletions
diff --git a/src/algo/ft_heapsort.c b/src/algo/ft_heapsort.c
new file mode 100644
index 0000000..afd395d
--- /dev/null
+++ b/src/algo/ft_heapsort.c
@@ -0,0 +1,50 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_heapsort.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/02/10 02:59:22 by cacharle #+# #+# */
+/* Updated: 2020/02/10 03:57:50 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft_algo.h"
+
+/* static void st_build_max_heap(void *base, size_t nel, size_t width, */
+/* int (*compar)(const void *, const void *)) */
+/* { */
+/* int i; */
+/* */
+/* i = 1; */
+/* while (i < nel) */
+/* { */
+/* compar(base + i * width, base + 2 * i * width) */
+/* */
+/* i++; */
+/* } */
+/* } */
+/* */
+/* static void st_heapify(void *base, size_t nel, size_t width, */
+/* int (*compar)(const void *, const void *)) */
+/* { */
+/* */
+/* } */
+
+int ft_heapsort(void *base, size_t nel, size_t width,
+ int (*compar)(const void *, const void *))
+{
+ /* size_t i; */
+ /* */
+ /* if (nel < 2) */
+ /* return (0); */
+ /* st_build_max_heap(base, nel, width, compar); */
+ /* i = -1; */
+ /* while (++i < nel) */
+ /* { */
+ /* ft_memswap(base, base + (nel - i - 1) * width); */
+ /* st_heapify(base, nel - i - 1, width, compar); */
+ /* } */
+ return (0);
+}
diff --git a/src/algo/ft_is_set.c b/src/algo/ft_is_set.c
index 8e45b49..3e7ae31 100644
--- a/src/algo/ft_is_set.c
+++ b/src/algo/ft_is_set.c
@@ -6,13 +6,14 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/19 07:17:15 by cacharle #+# #+# */
-/* Updated: 2020/01/19 08:21:12 by cacharle ### ########.fr */
+/* Updated: 2020/02/10 02:51:41 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
+#include "libft_algo.h"
-t_bool ft_is_set(void *base, size_t nel, size_t width,
+t_ftbool ft_is_set(void *base, size_t nel, size_t width,
t_ftcompar_func compar)
{
size_t i;
diff --git a/src/algo/ft_mergesort.c b/src/algo/ft_mergesort.c
new file mode 100644
index 0000000..5af248e
--- /dev/null
+++ b/src/algo/ft_mergesort.c
@@ -0,0 +1,65 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_mergesort.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/02/10 02:26:41 by cacharle #+# #+# */
+/* Updated: 2020/02/10 02:59:10 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft_algo.h"
+
+static int st_mergesort_error(void *left, void *right)
+{
+ free(left);
+ free(right);
+ return (-1);
+}
+
+static void st_merge_sorted(struct s_merge_sorted_arrays *arrays, size_t nel,
+ size_t width, int (*compar)(const void *, const void *))
+{
+ size_t li;
+ size_t ri;
+
+ li = 0;
+ ri = 0;
+ while (li < nel / 2 && ri < nel - nel / 2)
+ {
+ if (compar(arrays->left + li * width, arrays->right + ri * width) < 0)
+ ft_memcpy(arrays->base, arrays->left + li++ * width, width);
+ else
+ ft_memcpy(arrays->base, arrays->right + ri++ * width, width);
+ }
+ while (li < nel / 2)
+ ft_memcpy(arrays->base, arrays->left + li++ * width, width);
+ while (ri < nel - nel / 2)
+ ft_memcpy(arrays->base, arrays->right + ri++ * width, width);
+}
+
+int ft_mergesort(void *base, size_t nel, size_t width,
+ int (*compar)(const void *, const void *))
+{
+ size_t mid;
+ struct s_merge_sorted_arrays arrays;
+
+ if (nel < 2)
+ return (0);
+ mid = nel / 2;
+ if ((arrays.left = malloc(mid * width)) == NULL)
+ return (-1);
+ if ((arrays.right = malloc((nel - mid) * width)) == NULL)
+ return (st_mergesort_error(arrays.left, NULL));
+ ft_memcpy(arrays.left, base, mid * width);
+ ft_memcpy(arrays.right, base, (nel - mid) * width);
+ if (ft_mergesort(arrays.left, mid, width, compar) == -1)
+ return (st_mergesort_error(arrays.left, arrays.right));
+ if (ft_mergesort(arrays.right, nel - mid, width, compar) == -1)
+ return (st_mergesort_error(arrays.left, arrays.right));
+ arrays.base = base;
+ st_merge_sorted(&arrays, nel, width, compar);
+ return (0);
+}
diff --git a/src/algo/ft_qsort.c b/src/algo/ft_qsort.c
index 8c125a1..9bcfcdf 100644
--- a/src/algo/ft_qsort.c
+++ b/src/algo/ft_qsort.c
@@ -6,11 +6,11 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/19 07:25:51 by cacharle #+# #+# */
-/* Updated: 2020/01/19 08:28:32 by cacharle ### ########.fr */
+/* Updated: 2020/02/10 02:55:14 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
-#include "libft.h"
+#include "libft_algo.h"
static t_ftrange ft_range_new(int lo, int hi)
{