]> Untitled Git - axy/ft/pushswap.git/commitdiff
Quicksort
author= <=>
Mon, 8 Dec 2025 13:10:45 +0000 (14:10 +0100)
committer= <=>
Mon, 8 Dec 2025 13:10:45 +0000 (14:10 +0100)
Makefile
algorithm_quicksort.c
clist.c
list.c [new file with mode: 0644]
main_pushswap.c
ops_p.c
ops_rr.c
pushswap.h
stack.c

index 01878bda6633dc32ae3b9a5e4eabd1f6d49127e1..a4f0a04ad724a47f0979572ac997418c8e916d9c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 NAME=push_swap
 
-SRCS=cheatalloc.c clist.c main_pushswap.c ops.c ops_output.c ops_p.c ops_r.c ops_rr.c ops_s.c output.c psval.c stack.c stacks.c
+SRCS=algorithm_quicksort.c cheatalloc.c clist.c list.c main_pushswap.c ops.c ops_output.c ops_p.c ops_r.c ops_rr.c ops_s.c output.c psval.c stack.c stacks.c
 
 OBJS=${SRCS:%.c=${OBJDIR}/%.o}
 
index 71e6250c6e50aadb6b88913fe53b6ed9eea62517..05c62dce9071f42d0fe244a67591469b95540ebd 100644 (file)
@@ -6,22 +6,24 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/05 19:07:14 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/05 19:15:04 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/08 14:02:02 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "pushswap.h"
 
-static void    quicksort_sift_n(const t_stacks *stacks, size_t n, t_psval pivot, t_closure cb)
+static void    quicksort_sift(const t_stacks *stacks, t_closure cb, t_list range)
 {
        size_t  a;
        size_t  b;
+       t_psval pivot;
 
        a = 0;
        b = 0;
-       while (a + b < n)
+       pivot = range.ptr[range.len / 2];
+       while (a + b < range.len)
        {
-               if (clist_get_at(&stacks->a, 0) > pivot)
+               if (clist_get_at(stacks->a.list, 0) < pivot)
                {
                        a++;
                        (cb.func)(cb.data, OP_RA);
@@ -32,10 +34,35 @@ static void quicksort_sift_n(const t_stacks *stacks, size_t n, t_psval pivot, t_
                        (cb.func)(cb.data, OP_PB);
                }
        }
+}
+
+static void    quicksort_rec(const t_stacks *stacks, t_closure cb, t_list range)
+{
+       size_t  i;
+       size_t  pivot;
 
+       if (range.len == 2 
+               && clist_get_at(stacks->a.list, 0) > clist_get_at(stacks->a.list, -1))
+               (cb.func)(cb.data, OP_SA);
+       if (range.len <= 2)
+               return ;
+       pivot = range.len / 2;
+       quicksort_sift(stacks, cb, range);
+       i = 0;
+       while (i++ < range.len - pivot)
+               (cb.func)(cb.data, OP_PA);
+       quicksort_rec(stacks, cb, list_sub(range, pivot, range.len));
+       i = 0;
+       while (i++ < pivot)
+               (cb.func)(cb.data, OP_RRA);
+       quicksort_rec(stacks, cb, list_sub(range, 0, pivot));
 }
 
-void   algoritm_quicksort(const t_stacks *stacks, t_closure cb)
+void   algorithm_quicksort(const t_stacks *stacks, t_closure cb)
 {
-       
+       t_list  sorted;
+
+       sorted = list_new(stacks->a);
+       list_sort(sorted);
+       quicksort_rec(stacks, cb, sorted);
 }
diff --git a/clist.c b/clist.c
index 4952c8c0b2f53bf0e4cacac81427e59e581cc756..51776ab6df57a48f13af7a130d58a69ec728c25c 100644 (file)
--- a/clist.c
+++ b/clist.c
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/02 11:02:13 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/03 16:03:51 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/08 12:57:27 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -57,9 +57,9 @@ void  clist_push(t_clist **dst, t_clist *lst)
        if (*dst)
        {
                lst->next = (*dst)->next;
-               (*dst)->next->prev = lst;
+               lst->next->prev = lst;
                lst->prev = *dst;
-               (*dst)->prev->next = lst;
+               lst->prev->next = lst;
        }
        *dst = lst;
 }
@@ -69,12 +69,10 @@ void        clist_push_back(t_clist **dst, t_clist *lst)
 {
        lst->next = lst;
        lst->prev = lst;
-       if (*dst)
-       {
-               lst->prev = (*dst)->prev;
-               (*dst)->prev->next = lst;
-               lst->next = *dst;
-               (*dst)->prev = lst;
-       }
-       *dst = lst;
+       if (!*dst)
+               *dst = lst;
+       lst->prev = *dst;
+       lst->next = (*dst)->next;
+       (*dst)->next->prev = lst;
+       (*dst)->next = lst;
 }
diff --git a/list.c b/list.c
new file mode 100644 (file)
index 0000000..56becd4
--- /dev/null
+++ b/list.c
@@ -0,0 +1,59 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   list.c                                             :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/08 11:32:24 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/08 13:02:46 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+t_list list_new(t_stack stack)
+{
+       t_list  res;
+       size_t  i;
+
+       res.ptr = cheatalloc(sizeof(t_psval) * stack.len);
+       res.len = stack.len;
+       i = 0;
+       while(i < res.len)
+       {
+               res.ptr[i++] = stack.list->val;
+               stack.list = stack.list->prev;
+       }
+       return (res);
+}
+
+t_list list_sub(t_list self, size_t start, size_t end)
+{
+       if (start > end || self.len < end)
+               cheatexit(1);
+       self.len = end - start;
+       self.ptr += start;
+       return (self);
+}
+
+void   list_sort(t_list list)
+{
+       size_t  i;
+       size_t  least;
+       t_psval tmp;
+
+       while (list.len > 1)
+       {
+               i = 0;
+               least = i;
+               while (++i < list.len)
+                       if (list.ptr[i] < list.ptr[least])
+                               least = i;
+               tmp = list.ptr[0];
+               list.ptr[0] = list.ptr[least];
+               list.ptr[least] = tmp;
+               list.ptr++;
+               list.len--;
+       }
+}
index b4ad9e1e2737d87826cee369db1fbb4cd15625c4..021f5c590579258363c7b17f2bece13dff9a8085 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/02 22:15:12 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/08 10:38:21 by clefrere         ###   ########.fr       */
+/*   Updated: 2025/12/08 14:02:08 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -30,7 +30,7 @@ static void   arg_step(char *str, t_args *arg)
        else if (ft_streq(str, "--medium"))
                arg->algo = NULL;
        else if (ft_streq(str, "--complex"))
-               arg->algo = NULL;
+               arg->algo = &algorithm_quicksort;
        else if (ft_streq(str, "--adaptive"))
                arg->algo = NULL;
        else if (ft_streq(str, "--bench"))
@@ -39,24 +39,19 @@ static void arg_step(char *str, t_args *arg)
                stack_push_back(&arg->state.a, psval_parse(str));
 }
 
-static void    algorithm(const t_stacks *stacks, t_closure clos)
-{
-       (void) stacks;
-       for (t_op i = OP_SA; i <= OP_RRR; i++)
-               (clos.func)(clos.data, i);
-}
-
 int    main(int argc, char **argv)
 {
-       t_stacks        stacks;
-       t_ops           ops;
+       t_args  args;
+       t_ops   ops;
 
-       stacks = stacks_new();
+       args.state = stacks_new();
+       args.bench = false;
+       args.algo = NULL;
+       for (int i = 1; i < argc; i++)
+               arg_step(argv[i], &args);
        ops = ops_init();
        ops_add_output(&ops);
-       for (int i = 1; i < argc; i++)
-               stack_push_back(&stacks.a, psval_parse(argv[i]));
-       stacks_apply(&stacks, &ops, &algorithm);
+       stacks_apply(&args.state, &ops, args.algo);
        output_flush();
-       cheatexit(!stacks_is_solved(&stacks));
+       cheatexit(!stacks_is_solved(&args.state));
 }
diff --git a/ops_p.c b/ops_p.c
index c2118c33ad83dcb8addb8c41627f022c0e59a9b0..5b9ee38f8e59386a216de15ae9c938259776bfba 100644 (file)
--- a/ops_p.c
+++ b/ops_p.c
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/03 13:20:25 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/03 13:22:22 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/08 12:49:35 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -15,7 +15,8 @@
 static void    ops_pa_inner(void *data, t_stacks *stacks)
 {
        (void) data;
-       stack_move(&stacks->b, &stacks->a);
+       if (stacks->b.len)
+               stack_move(&stacks->b, &stacks->a);
 }
 
 t_closure      ops_pa(void)
@@ -30,7 +31,8 @@ t_closure     ops_pa(void)
 static void    ops_pb_inner(void *data, t_stacks *stacks)
 {
        (void) data;
-       stack_move(&stacks->a, &stacks->b);
+       if (stacks->a.len)
+               stack_move(&stacks->a, &stacks->b);
 }
 
 t_closure      ops_pb(void)
index 4d40bb6ee4d47c47b8ed0efc4bedaa1c5b67f208..82ae6688162a16517cfa1ce69a87995d48000f30 100644 (file)
--- a/ops_rr.c
+++ b/ops_rr.c
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/03 13:17:23 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/03 13:19:47 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/08 12:41:25 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -15,7 +15,7 @@
 static void    ops_rra_inner(void *data, t_stacks *stacks)
 {
        (void) data;
-       stack_rotate_n(&stacks->a, 1);
+       stack_rotate_n(&stacks->a, -1);
 }
 
 t_closure      ops_rra(void)
@@ -30,7 +30,7 @@ t_closure     ops_rra(void)
 static void    ops_rrb_inner(void *data, t_stacks *stacks)
 {
        (void) data;
-       stack_rotate_n(&stacks->b, 1);
+       stack_rotate_n(&stacks->b, -1);
 }
 
 t_closure      ops_rrb(void)
index a2e8d31d897cdf9e2d7f19528cf39043a04ab679..5f04aeff9cc5ad891f8f87b94025659b5dbfb32b 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/02 11:02:44 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/05 19:08:52 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/08 12:03:24 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -75,6 +75,12 @@ typedef struct s_ops
        t_closure       ops[11];
 }      t_ops;
 
+typedef struct s_list
+{
+       size_t  len;
+       t_psval *ptr;
+}      t_list;
+
 void           cheatexit(int errcode);
 void           *cheatalloc(size_t len);
 
@@ -122,4 +128,10 @@ t_closure  ops_compose(t_closure first, t_closure second);
 t_ops          ops_init(void);
 void           ops_add_output(t_ops *ops);
 
+t_list         list_new(t_stack stack);
+t_list         list_sub(t_list self, size_t start, size_t end);
+void           list_sort(t_list list);
+
+void           algorithm_quicksort(const t_stacks *stacks, t_closure cb);
+
 #endif
diff --git a/stack.c b/stack.c
index 09bfe8d247a9ce7ca5463c68df27c7665ee6102e..0db42a82db8cfee343b5845ed46ab86538f5197f 100644 (file)
--- a/stack.c
+++ b/stack.c
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/03 12:53:25 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/03 15:40:28 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/08 14:00:35 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -29,7 +29,7 @@ void  stack_rotate_n(t_stack *stack, int n)
        }
        while (n > 0)
        {
-               stack->list = stack->list->next;
+               stack->list = stack->list->prev;
                n--;
        }
 }
@@ -41,8 +41,8 @@ void  stack_swap_top(t_stack *stack)
        if (stack->len == 0)
                return ;
        tmp = stack->list->val;
-       stack->list->val = stack->list->next->val;
-       stack->list->next->val = tmp;
+       stack->list->val = stack->list->prev->val;
+       stack->list->prev->val = tmp;
 }
 
 void   stack_move(t_stack *src, t_stack *dst)