#include "push_swap.h" int last_element(t_stack *a) { while (a->next) a = a->next; return (a->n); } // size is initialized to 1 because the loop check the next element, so it will end one step before reaching it // it checks the next one to avoid handle the first one with ->limit set to 1 int sublist_size(t_stack *list) { int size; if (list == NULL) return (0); size = 1; while (list->next != NULL && list->next->limit != 1) { list = list->next; size++; } return (size); } int nbr_element_smaller(t_stack *list, int size, int pivot) { int nbr; nbr = 0; while (size-- > 0) { if (list->n < pivot) nbr++; list = list->next; } return (nbr); } // pivot is the smallest of the bigger group int find_pivot(t_stack *list, int size) { int pivot; t_stack *head; pivot = list->n; head = list; while (head->next && nbr_element_smaller(list, size, pivot) != size / 2) { head = head->next; pivot = head->n; } return (pivot); } int divide_a(t_stack **a, t_stack **b, t_list *solution) { int list_size; int pivot; t_stack *first_rotate; first_rotate = NULL; list_size = sublist_size(*a); pivot = find_pivot(*a, list_size); (*a)->limit = 0; while (list_size-- > 0) { if ((*a)->n >= pivot) { if (!first_rotate) first_rotate = *a; ra(a, &solution); } else pb(b, a, &solution); } while (*a != first_rotate) rra(a, &solution); (*a)->limit = 1; (*b)->limit = 1; mark_step(solution, "divide_a"); return (0); } int divide_b(t_stack **a, t_stack **b, t_list *solution) { int list_size; int pivot; t_stack *first_rotate; first_rotate = NULL; list_size = sublist_size(*b); pivot = find_pivot(*b, list_size); (*b)->limit = 0; while (list_size-- > 0) { if ((*b)->n >= pivot) pa(a, b, &solution); else { if (!first_rotate) first_rotate = *b; rb(b, &solution); } } while (*b != first_rotate) rrb(b, &solution); (*a)->limit = 1; (*b)->limit = 1; mark_step(solution, "divide_b"); return (0); } void send_sublist_to_a(t_stack **a, t_stack **b, t_list *solution) { int list_size; list_size = sublist_size(*b); (*b)->limit = 0; while (list_size-- > 0) pa(a, b, &solution); (*a)->limit = 1; if (*b) (*b)->limit = 1; mark_step(solution, "send_sublist_to_a"); } void mini_sort(t_stack **a, t_stack **b, t_list *solution) { (void)a; (void)b; (void)solution; } void hugo_sort(t_stack **a, t_stack **b, t_list *solution) { if (sublist_size(*a) > 5) divide_a(a, b, solution); else if (sublist_size(*b) > 5) { mini_sort(a, b, solution); divide_b(a, b, solution); } else if (sublist_size(*b) > 0) send_sublist_to_a(a, b, solution); else return ; hugo_sort(a, b, solution); } // /* // ** n is the nbr of elements of the list that are competiting // ** position start at 0, ie position 3 is the 4th element // */ // int match(t_stack *a, int n, int *smaller) // { // int position; // int i; // // *smaller = a->n; // position = 0; // i = 1; // while (a->next && i < n) // { // a = a->next; // if (a->n < *smaller) // { // *smaller = a->n; // position = i; // } // i++; // } // return (position); // } // // void nb_to_top(t_stack **a, t_list *solution, int i) // { // int n; // // if (!i) // return ; // n = i; // while (--n) // ra(a, &solution); // n = i; // sa(a, &solution); // while (--n) // { // rra(a, &solution); // sa(a, &solution); // } // } // // void push_to_b(t_stack **a, t_stack **b, t_list *solution, int position) // { // int i; // // i = position; // while (i--) // ra(a, &solution); // pb(b, a, &solution); // while (++i < position) // rra(a, &solution); // } // // /* // ** so far it's bullshit :p // */ // void hugo_sort(t_stack **a, t_stack **b, t_list *solution) // { // int last; // int position; // int value; // // last = last_element(*a); // while ((*a)->n != last) // { // position = match(*a, 4, &value); // if (!(*b) || value > (*b)->n) // push_to_b(a, b, solution, position); // else // ra(a, &solution); // } // } /* sa(a, &solution); pb(b, a, &solution); pb(b, a, &solution); pb(b, a, &solution); pb(b, a, &solution); pb(b, a, &solution); pa(a, b, &solution); sa(a, &solution); sb(b, &solution); sa(a, &solution); rra(a, &solution); rrb(b, &solution); rrr(a, b, &solution); ra(a, &solution); rb(b, &solution); rr(a, b, &solution); */