CC = cc
CFLAGS = -Wall -Wextra -Werror
-SRC_FILES = main.c ft_atol.c input_handling.c stack_utils.c command_handling.c sorting.c stack_optimization.c cmd_optimization.c
+SRC_FILES = main.c ft_atol.c input_handling.c stack_utils.c command_handling.c sorting.c sort_few.c stack_optimization.c cmd_optimization.c
OBJ_FILES = $(SRC_FILES:%.c=%.o)
LIB_DIR = $(LIBFT)
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 16:42:34 by dkaiser #+# #+# */
-/* Updated: 2024/04/26 15:52:23 by dkaiser ### ########.fr */
+/* Updated: 2024/04/27 13:51:08 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
optimize_redundant(data, PA, PB);
optimize_redundant(data, RB, RRB);
optimize_two_stack_ops(data, RA, RB, RR);
+ optimize_two_stack_ops(data, SA, SB, SS);
}
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 14:38:47 by dkaiser #+# #+# */
-/* Updated: 2024/04/26 13:55:07 by dkaiser ### ########.fr */
+/* Updated: 2024/04/27 13:38:41 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
return (0);
}
-static void run_for_both(t_stack *stack_a, t_stack *stack_b,
- void (*f)(t_stack *))
-{
- f(stack_a);
- f(stack_b);
-}
-
-void run_command(t_psdata *data, enum e_pscmd cmd)
-{
- if (cmd == SA)
- stack_swap(data->a);
- else if (cmd == SB)
- stack_swap(data->b);
- else if (cmd == SS)
- run_for_both(data->a, data->b, stack_swap);
- else if (cmd == PA)
- stack_push(data->a, data->b);
- else if (cmd == PB)
- stack_push(data->b, data->a);
- else if (cmd == RA)
- stack_rotate(data->a);
- else if (cmd == RB)
- stack_rotate(data->b);
- else if (cmd == RR)
- run_for_both(data->a, data->b, stack_rotate);
- else if (cmd == RRA)
- stack_rrotate(data->a);
- else if (cmd == RRB)
- stack_rrotate(data->b);
- else if (cmd == RRR)
- run_for_both(data->a, data->b, stack_rrotate);
- add_cmd_to_queue(&data->cmds, cmd);
-}
-
static void print_cmd(void *ptr_cmd)
{
enum e_pscmd cmd;
{
ft_lstiter(cmds, print_cmd);
}
+
+static void run_for_both(t_stack *stack_a, t_stack *stack_b,
+ void (*f)(t_stack *))
+{
+ f(stack_a);
+ f(stack_b);
+}
+
+void run_command(t_psdata *data, enum e_pscmd cmd)
+{
+ if (cmd == SA)
+ stack_swap(data->a);
+ else if (cmd == SB)
+ stack_swap(data->b);
+ else if (cmd == SS)
+ run_for_both(data->a, data->b, stack_swap);
+ else if (cmd == PA)
+ stack_push(data->a, data->b);
+ else if (cmd == PB)
+ stack_push(data->b, data->a);
+ else if (cmd == RA)
+ stack_rotate(data->a);
+ else if (cmd == RB)
+ stack_rotate(data->b);
+ else if (cmd == RR)
+ run_for_both(data->a, data->b, stack_rotate);
+ else if (cmd == RRA)
+ stack_rrotate(data->a);
+ else if (cmd == RRB)
+ stack_rrotate(data->b);
+ else if (cmd == RRR)
+ run_for_both(data->a, data->b, stack_rrotate);
+ add_cmd_to_queue(&data->cmds, cmd);
+}
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/12 16:59:09 by dkaiser #+# #+# */
-/* Updated: 2024/04/26 16:19:46 by dkaiser ### ########.fr */
+/* Updated: 2024/04/27 14:26:01 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
void optimize_commands(t_psdata *data);
void stack_sort(t_psdata *data);
+void sort_three(t_psdata *data);
+void sort_few(t_psdata *data);
#endif // PUSH_SWAP_H
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* sort_few.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/04/27 14:24:54 by dkaiser #+# #+# */
+/* Updated: 2024/04/27 15:13:03 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "push_swap.h"
+
+void sort_three(t_psdata *data)
+{
+ if (data->a->stack[1] > data->a->stack[0]
+ && data->a->stack[1] > data->a->stack[2])
+ run_command(data, RRA);
+ else if (data->a->stack[0] > data->a->stack[1]
+ && data->a->stack[0] > data->a->stack[2])
+ run_command(data, RA);
+ if (data->a->stack[0] > data->a->stack[1])
+ run_command(data, SA);
+}
+
+static int get_min_pos(t_stack *stack)
+{
+ int i;
+ int min;
+
+ i = 0;
+ min = 2147483647;
+ while (i < stack->size)
+ {
+ if (stack->stack[i] < min)
+ min = stack->stack[i];
+ i++;
+ }
+ i = 0;
+ while (stack->stack[i] != min)
+ i++;
+ return (i);
+}
+
+static void rotate_a_n(t_psdata *data, int n)
+{
+ if (n < (data->a->size + 1) / 2)
+ {
+ while (n--)
+ run_command(data, RA);
+ }
+ else
+ {
+ n = data->a->size - n;
+ while (n--)
+ run_command(data, RRA);
+ }
+}
+
+static void reinsert_nbrs(t_psdata *data)
+{
+ int i;
+
+ while (data->b->size > 0)
+ {
+ if (data->b->stack[0] >= data->a->size)
+ {
+ run_command(data, PA);
+ run_command(data, RA);
+ }
+ else
+ {
+ i = 0;
+ while (i < data->a->size && data->b->stack[0] > data->a->stack[i])
+ i++;
+ rotate_a_n(data, i);
+ run_command(data, PA);
+ if (data->a->stack[0] != data->b->stack[0] - 1)
+ rotate_a_n(data, get_min_pos(data->a));
+ }
+ }
+}
+
+void sort_few(t_psdata *data)
+{
+ if (data->a->stack[0] == data->a->size - 1)
+ run_command(data, RA);
+ while (data->a->size > 3)
+ run_command(data, PB);
+ if (data->b->stack[0] > data->b->stack[1])
+ run_command(data, SB);
+ sort_three(data);
+ reinsert_nbrs(data);
+}
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 15:04:19 by dkaiser #+# #+# */
-/* Updated: 2024/04/26 18:35:27 by dkaiser ### ########.fr */
+/* Updated: 2024/04/27 14:36:06 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
return (1);
}
-static void sort_three(t_psdata *data)
-{
- if (data->a->stack[1] > data->a->stack[0]
- && data->a->stack[1] > data->a->stack[2])
- run_command(data, RRA);
- else if (data->a->stack[0] > data->a->stack[1]
- && data->a->stack[0] > data->a->stack[2])
- run_command(data, RA);
- if (data->a->stack[0] > data->a->stack[1])
- run_command(data, SA);
-}
-
static void ps_radixsort(t_psdata *data, int bit)
{
int i;
run_command(data, SA);
else if (data->a->size == 3)
sort_three(data);
+ else if (data->a->size == 4 || data->a->size == 5)
+ sort_few(data);
else
ps_radixsort(data, 0);
}