summaryrefslogtreecommitdiff
path: root/cmd_optimization.c
diff options
context:
space:
mode:
authorDominik Kaiser2024-04-16 17:35:14 +0200
committerDominik Kaiser2024-04-16 17:35:14 +0200
commitd7494ad228ed8b3e166f28180c3b3550d79d4cc7 (patch)
tree3a7c193bfbfa39d9c1139415150f6bec6b41c787 /cmd_optimization.c
parent321cd3e03788cb1f077268d84f8c0c064fadb2ae (diff)
downloadpush_swap-quicksort.tar.gz
push_swap-quicksort.zip
Work on optimization (still not working)quicksortoptimization
Diffstat (limited to 'cmd_optimization.c')
-rw-r--r--cmd_optimization.c93
1 files changed, 54 insertions, 39 deletions
diff --git a/cmd_optimization.c b/cmd_optimization.c
index 63be895..3aeaf8b 100644
--- a/cmd_optimization.c
+++ b/cmd_optimization.c
@@ -6,13 +6,14 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 16:42:34 by dkaiser #+# #+# */
-/* Updated: 2024/04/16 13:15:34 by dkaiser ### ########.fr */
+/* Updated: 2024/04/16 17:33:54 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft/ft_printf.h"
#include "libft/libft.h"
#include "push_swap.h"
+#include <stdlib.h>
static enum e_pscmd get_cmd(t_list *cmd)
{
@@ -22,7 +23,7 @@ static enum e_pscmd get_cmd(t_list *cmd)
return NO_CMD;
}
-static void optimize_redundant_pushes(t_psdata *data)
+static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1, enum e_pscmd cmd2)
{
t_list *cur;
t_list *last;
@@ -32,9 +33,11 @@ static void optimize_redundant_pushes(t_psdata *data)
last = cur;
optimizations = 0;
- while (cur->next)
+ if (!cur)
+ return ;
+ while (cur && cur->next)
{
- if ((get_cmd(cur) == PA && get_cmd(cur->next) == PB) || (get_cmd(cur) == PB && get_cmd(cur->next) == PA))
+ if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2) || (get_cmd(cur) == cmd2 && get_cmd(cur->next) == cmd1))
{
last->next = cur->next->next;
ft_lstdelone(cur->next, free);
@@ -42,70 +45,82 @@ static void optimize_redundant_pushes(t_psdata *data)
optimizations++;
}
last = last->next;
- cur = last->next;
+ if (last)
+ cur = last->next;
+ else
+ cur = NULL;
}
if (optimizations)
- optimize_redundant_pushes(data);
+ optimize_redundant(data, cmd1, cmd2);
+}
+
+static void lstinsert(t_list *list, t_list *elem)
+{
+ t_list *next;
+
+ next = list->next;
+ list->next = elem;
+ elem->next = next;
}
static void fake_command(t_psdata *data, enum e_pscmd cmd)
{
if (cmd == PA)
{
- data->a->size++;
- data->b->size--;
+ if (data->b->size > 0)
+ stack_push(data->a, data->b);
}
else if (cmd == PB)
{
- data->a->size--;
- data->b->size++;
+ if (data->a->size > 0)
+ stack_push(data->b, data->a);
}
}
static void optimize_rotate(t_psdata *data)
{
- t_list *cur;
+ t_list *cmd;
t_list *last_before;
- t_list *first_after;
- enum e_pscmd *cmd;
+ t_list *new_elem;
+ enum e_pscmd *rra;
+ int ras;
int i;
- cur = data->cmds;
- while(cur)
+ cmd = data->cmds;
+
+ while (cmd)
{
- if (get_cmd(cur->next) == RA)
+ ras = 0;
+ if (get_cmd(cmd) != RA)
+ last_before = cmd;
+ while (get_cmd(cmd) == RA)
{
- last_before = cur;
- cur = cur->next;
+ ras++;
+ cmd = cmd->next;
+ }
+ if (ras > data->a->size / 2) {
i = 0;
- while (cur && get_cmd(cur) == RA)
- {
- i++;
- cur = cur->next;
- }
- first_after = cur;
- if (i >= (data->a->size - 1) / 2)
+ while(i++ <= data->a->size)
{
- cmd = malloc(sizeof(enum e_pscmd));
- *cmd = RRA;
- cur = last_before->next;
- while (i < data->a->size)
- {
- cur->next = ft_lstnew(cmd);
- cur = cur->next;
- i++;
- }
- cur->next = first_after;
- ft_printf("i: %d\n", i);
+ rra = malloc(sizeof(enum e_pscmd));
+ if (!rra)
+ ft_printf("ERROR!!!");
+ *rra = RRA;
+ new_elem = ft_lstnew(rra);
+ if (!new_elem)
+ ft_printf("AAAAAAAAAAA");
+ lstinsert(last_before, new_elem);
}
}
- fake_command(data, get_cmd(cur));
- cur = cur->next;
+ fake_command(data, get_cmd(cmd));
+ cmd = cmd->next;
}
}
void optimize_commands(t_psdata *data)
{
- optimize_redundant_pushes(data);
+ /* ft_printf("SIZE A: %d\n", data->a->size); */
+ optimize_redundant(data, PA, PB);
optimize_rotate(data);
+ optimize_redundant(data, RA, RRA);
}