]> git.dkaiser.de - 42/push_swap.git/commitdiff
Add stack optimization
authorDominik Kaiser <dkaiser@2-E-4.42heilbronn.de>
Sat, 13 Apr 2024 14:29:20 +0000 (16:29 +0200)
committerDominik Kaiser <dkaiser@2-E-4.42heilbronn.de>
Sat, 13 Apr 2024 14:29:20 +0000 (16:29 +0200)
I want to use lsd radix sort which only works with positive numbers.
The added functions optimize the stack so it is only positive numbers.
As we don't need the actual contents of the stack, we can just override.

optimization.c

index 4348acfed693ea177a2e96fb0e9fc656c324f9b3..f1eca7e6dbf06ab9823e80fbbb2649a7c5a3c0b7 100644 (file)
@@ -6,13 +6,79 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/13 15:25:05 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/13 15:29:58 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/13 16:27:05 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
+#include "libft/ft_printf.h"
+#include "libft/libft.h"
 #include "push_swap.h"
+#include <stdlib.h>
+
+static void sort_array(int size, int *tmp_array)
+{
+    int i;
+    int k;
+    int tmp;
+
+    i = 0;
+    while (i < size - 1)
+    {
+        k = i + 1;
+        while (k < size)
+        {
+            if (tmp_array[i] > tmp_array[k])
+            {
+                tmp = tmp_array[i];
+                tmp_array[i] = tmp_array[k];
+                tmp_array[k] = tmp;
+            }
+            k++;
+        }
+        i++;
+    }
+}
+
+static void override_stack(t_list **stack, int *tmp_array)
+{
+    t_list *cur;
+    int content;
+    int i;
+
+    cur = *stack;
+    while (cur)
+    {
+        i = 0;
+        content = *(int*)cur->content;
+        while (content != tmp_array[i])
+            i++;
+        *(int*)cur->content = i;
+        cur = cur->next;
+    }
+}
 
 void stack_optimize(t_list **stack)
 {
+    int size;
+    int *tmp_array;
+    t_list *cur;
+    int i;
+
+    size = ft_lstsize(*stack);
+    cur = *stack;
+    tmp_array = malloc(size * sizeof(int));
+    if (!tmp_array)
+        ; // TODO: Error handling
+    i = 0;
 
+    while(cur)
+    {
+        tmp_array[i++] = *(int*)cur->content;
+        cur = cur->next;
+    }
+    if (i != size)
+        ; // TODO: Error handling
+    sort_array(size, tmp_array);
+    i = 0;
+    override_stack(stack, tmp_array);
 }