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}
/* 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);
(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);
}
/* 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 */
/* */
/* ************************************************************************** */
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;
}
{
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;
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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--;
+ }
+}
/* 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 */
/* */
/* ************************************************************************** */
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"))
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));
}
/* 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 */
/* */
/* ************************************************************************** */
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)
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)
/* 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 */
/* */
/* ************************************************************************** */
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)
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)
/* 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 */
/* */
/* ************************************************************************** */
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);
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
/* 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 */
/* */
/* ************************************************************************** */
}
while (n > 0)
{
- stack->list = stack->list->next;
+ stack->list = stack->list->prev;
n--;
}
}
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)