From: = <=> Date: Mon, 8 Dec 2025 13:10:45 +0000 (+0100) Subject: Quicksort X-Git-Url: https://git.uwuaxy.net/?a=commitdiff_plain;h=a8acc9e17414c3aacb53eb019a3e24115870c809;p=axy%2Fft%2Fpushswap.git Quicksort --- diff --git a/Makefile b/Makefile index 01878bd..a4f0a04 100644 --- 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} diff --git a/algorithm_quicksort.c b/algorithm_quicksort.c index 71e6250..05c62dc 100644 --- a/algorithm_quicksort.c +++ b/algorithm_quicksort.c @@ -6,22 +6,24 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 4952c8c..51776ab 100644 --- a/clist.c +++ b/clist.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 index 0000000..56becd4 --- /dev/null +++ b/list.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* 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--; + } +} diff --git a/main_pushswap.c b/main_pushswap.c index b4ad9e1..021f5c5 100644 --- a/main_pushswap.c +++ b/main_pushswap.c @@ -6,7 +6,7 @@ /* By: clefrere +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 c2118c3..5b9ee38 100644 --- a/ops_p.c +++ b/ops_p.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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) diff --git a/ops_rr.c b/ops_rr.c index 4d40bb6..82ae668 100644 --- a/ops_rr.c +++ b/ops_rr.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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) diff --git a/pushswap.h b/pushswap.h index a2e8d31..5f04aef 100644 --- a/pushswap.h +++ b/pushswap.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 09bfe8d..0db42a8 100644 --- a/stack.c +++ b/stack.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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)