/ push_swap / push_swap / so_sort_utils.c
so_sort_utils.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   so_sort_utils.c                                    :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/11/20 21:55:36 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/12/04 13:39:56 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "push_swap.h"
14  
15  static void	sort_three(t_deque *deque_a)
16  {
17  	if (deque_a->head->data > deque_a->head->next->data
18  		&& deque_a->head->data > deque_a->tail->data)
19  		ra(deque_a);
20  	else if (deque_a->head->next->data > deque_a->head->data
21  		&& deque_a->head->next->data > deque_a->tail->data)
22  		rra(deque_a);
23  	if (deque_a->head->data > deque_a->head->next->data)
24  		sa(deque_a);
25  }
26  
27  void	sort_small(t_deque *deque_a, t_deque *deque_b, int size)
28  {
29  	if (size == 1)
30  		return ;
31  	else if (size == 2)
32  		sa(deque_a);
33  	else if (size == 3)
34  		sort_three(deque_a);
35  	else
36  	{
37  		while (deque_a->size > 3)
38  			pb(deque_a, deque_b);
39  		sort_three(deque_a);
40  		greedy_sort(deque_a, deque_b);
41  		sort_finalize(deque_a);
42  	}
43  }
44  
45  void	sort_finalize(t_deque *deque_a)
46  {
47  	int	min;
48  	int	index;
49  
50  	min = deque_min_data(deque_a);
51  	index = find_best_index_min_mid(deque_a, min);
52  	if (index < 0)
53  	{
54  		index *= -1;
55  		while (index--)
56  			rra(deque_a);
57  	}
58  	else
59  	{
60  		while (index--)
61  			ra(deque_a);
62  	}
63  }
64  
65  void	array_sort(int *array, int size)
66  {
67  	int	i;
68  	int	j;
69  	int	tmp;
70  
71  	i = 0;
72  	while (i < size)
73  	{
74  		j = 0;
75  		while (j < size - 1)
76  		{
77  			if (array[j] > array[j + 1])
78  			{
79  				tmp = array[j];
80  				array[j] = array[j + 1];
81  				array[j + 1] = tmp;
82  			}
83  			j++;
84  		}
85  		i++;
86  	}
87  }