From e2495fa62ff8789f6b7fc82403786b4f5619290c Mon Sep 17 00:00:00 2001 From: David Gailleton Date: Mon, 15 Dec 2025 14:47:27 +0100 Subject: [PATCH] add three pre sort alg + optimized simple sort alg --- algorithms/insertion/insertion.c | 32 ++++++--------------- algorithms/utils/iterate.c | 6 ++-- algorithms/utils/pre_sort.c | 49 ++++++++++++++++++++++++++++++++ push_swap.h | 4 ++- 4 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 algorithms/utils/pre_sort.c diff --git a/algorithms/insertion/insertion.c b/algorithms/insertion/insertion.c index f957c62..f5fe9ca 100644 --- a/algorithms/insertion/insertion.c +++ b/algorithms/insertion/insertion.c @@ -6,35 +6,12 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/10 15:38:52 by dgaillet #+# #+# */ -/* Updated: 2025/12/14 17:31:02 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/12/15 14:45:54 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -static int r_to_lowest(t_stack *stack, int len) -{ - t_stack *lowest; - int lowest_i; - int i; - - i = 1; - lowest_i = 0; - lowest = stack; - stack = stack->next; - while (i < len) - { - if (stack->value < lowest->value) - { - lowest_i = i; - lowest = stack; - } - stack = stack->next; - i++; - } - return (lowest_i); -} - static int to_insert(t_stacks *stacks, int sorted) { int i; @@ -76,6 +53,13 @@ void insertion(t_stacks *stacks, int len) { int i; + if (len == 3) + { + sort_three_a(stacks); + return ; + } + if (check_order(stacks->a)) + return ; i = 0; while (i < len) { diff --git a/algorithms/utils/iterate.c b/algorithms/utils/iterate.c index 9d58c89..cc38bdd 100644 --- a/algorithms/utils/iterate.c +++ b/algorithms/utils/iterate.c @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/11 17:49:56 by dgaillet #+# #+# */ -/* Updated: 2025/12/11 18:29:05 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/12/15 14:44:56 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,8 @@ void iterate_fn(t_stacks *stacks, int i, void (f)(t_stacks *stacks)) void optimal_rotate(t_stacks *stacks, int i, int len, char stack) { + if (i == len) + return ; if (i && len / i >= 2) { if (stack == 'a') @@ -30,7 +32,7 @@ void optimal_rotate(t_stacks *stacks, int i, int len, char stack) else iterate_fn(stacks, i, &rb); } - else + else if (i) { if (stack == 'a') iterate_fn(stacks, len - i, &rra); diff --git a/algorithms/utils/pre_sort.c b/algorithms/utils/pre_sort.c new file mode 100644 index 0000000..bdad641 --- /dev/null +++ b/algorithms/utils/pre_sort.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pre_sort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dgaillet +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/12/15 14:21:20 by dgaillet #+# #+# */ +/* Updated: 2025/12/15 14:39:21 by dgaillet ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +int r_to_lowest(t_stack *stack, int len) +{ + t_stack *lowest; + int lowest_i; + int i; + + i = 1; + lowest_i = 0; + lowest = stack; + stack = stack->next; + while (i < len) + { + if (stack->value < lowest->value) + { + lowest_i = i; + lowest = stack; + } + stack = stack->next; + i++; + } + return (lowest_i); +} + +void sort_three_a(t_stacks *stacks) +{ + if (check_order(stacks->a)) + return ; + optimal_rotate(stacks, r_to_lowest(stacks->a, 3), 3, 'a'); + if (stacks->a->next->value > stacks->a->previous->value) + { + ra(stacks); + sa(stacks); + rra(stacks); + } +} diff --git a/push_swap.h b/push_swap.h index 6901391..18eb662 100644 --- a/push_swap.h +++ b/push_swap.h @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/08 14:18:06 by dgaillet #+# #+# */ -/* Updated: 2025/12/14 16:55:24 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/12/15 14:34:45 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -58,6 +58,8 @@ void iterate_fn(t_stacks *stacks, int i, void (f)(t_stacks *stacks)); int is_lowest(t_stack *stack, t_stack *node, int len); int is_highest(t_stack *stack, t_stack *node, int len); void optimal_rotate(t_stacks *stacks, int i, int len, char stack); +int r_to_lowest(t_stack *stack, int len); +void sort_three_a(t_stacks *stacks); /*ALGORITHMS*/ void bubble_alg(t_stacks *stacks);