/ push_swap / push_swap / so_greedy_sort.c
so_greedy_sort.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   so_greedy_sort.c                                   :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/11/20 16:09:43 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/12/08 16:29:31 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "push_swap.h"
14  
15  static void	rotate_both(t_deque *deque_a, t_deque *deque_b, int *ia, int *ib)
16  {
17  	while (*ia > 0 && *ib > 0)
18  	{
19  		rr(deque_a, deque_b);
20  		*ia = *ia - 1;
21  		*ib = *ib - 1;
22  	}
23  	while (*ia < 0 && *ib < 0)
24  	{
25  		rrr(deque_a, deque_b);
26  		*ia = *ia + 1;
27  		*ib = *ib + 1;
28  	}
29  }
30  
31  static void	rotate_deque_a(t_deque *deque_a, int index)
32  {
33  	if (index > 0)
34  	{
35  		while (index--)
36  			ra(deque_a);
37  	}
38  	else
39  	{
40  		index *= -1;
41  		while (index--)
42  			rra(deque_a);
43  	}
44  }
45  
46  static void	rotate_deque_b(t_deque *deque_b, int index)
47  {
48  	if (index > 0)
49  	{
50  		while (index--)
51  			rb(deque_b);
52  	}
53  	else
54  	{
55  		index *= -1;
56  		while (index--)
57  			rrb(deque_b);
58  	}
59  }
60  
61  void	greedy_sort(t_deque *deque_a, t_deque *deque_b)
62  {
63  	int	ia;
64  	int	ib;
65  
66  	while (deque_b->size)
67  	{
68  		ia = 0;
69  		ib = 0;
70  		find_index(deque_a, deque_b, &ia, &ib);
71  		rotate_both(deque_a, deque_b, &ia, &ib);
72  		rotate_deque_a(deque_a, ia);
73  		rotate_deque_b(deque_b, ib);
74  		pa(deque_a, deque_b);
75  	}
76  }
77  
78  void	sort(int *array, t_deque *deque_a, t_deque *deque_b)
79  {
80  	int	size;
81  	int	p_a;
82  	int	p_b;
83  
84  	size = deque_a->size;
85  	array_sort(array, size);
86  	p_a = array[size * 1 / 3];
87  	p_b = array[size * 2 / 3];
88  	if (size <= 5)
89  		sort_small(deque_a, deque_b, size);
90  	else
91  	{
92  		deque_partition(deque_a, deque_b, p_a, p_b);
93  		greedy_sort(deque_a, deque_b);
94  		sort_finalize(deque_a);
95  	}
96  }