all sorts of sorts =3

added specific sort for 3 and 5
This commit is contained in:
Tanguy MAZE 2019-03-09 18:57:09 +01:00
parent efab9452b1
commit 9ab20ed483
3 changed files with 99 additions and 26 deletions

View File

@ -6,7 +6,7 @@
/* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */ /* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2019/02/23 13:35:15 by tmaze #+# #+# */ /* Created: 2019/02/23 13:35:15 by tmaze #+# #+# */
/* Updated: 2019/03/08 16:48:26 by tmaze ### ########.fr */ /* Updated: 2019/03/09 14:57:41 by tmaze ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -50,10 +50,10 @@ int read_ops(t_psdata *data)
buff = NULL; buff = NULL;
while ((ret = get_next_line(0, &buff)) > 0) while ((ret = get_next_line(0, &buff)) > 0)
{ {
ft_printf("'%s'\n", buff);
if (ft_strlen(buff) > 4 || !is_op(buff) || (nop = ft_lstnew(buff, 4)) == NULL) if (ft_strlen(buff) > 4 || !is_op(buff) || (nop = ft_lstnew(buff, 4)) == NULL)
{ {
ft_putendl_fd("Error", 2); ft_printf("'%s' %d %d %d\n", buff, ft_strlen(buff) > 4, !is_op(buff), nop == NULL);
ft_putendl_fd("Error 2", 2);
return (1); return (1);
} }
ft_lstaddend(&(data->op), nop); ft_lstaddend(&(data->op), nop);

View File

@ -6,7 +6,7 @@
/* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */ /* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2019/02/25 12:44:08 by tmaze #+# #+# */ /* Created: 2019/02/25 12:44:08 by tmaze #+# #+# */
/* Updated: 2019/03/08 16:25:38 by tmaze ### ########.fr */ /* Updated: 2019/03/09 15:04:14 by tmaze ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -56,7 +56,7 @@ int get_params(t_psdata *data, int ac, char **av)
ps_stkpsh(data, 'a', new); ps_stkpsh(data, 'a', new);
else else
{ {
ft_putendl_fd("Error", 2); ft_putendl_fd("Error 1", 2);
ps_stkclean(data); ps_stkclean(data);
return (0); return (0);
} }

View File

@ -6,7 +6,7 @@
/* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */ /* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2019/03/03 11:41:49 by tmaze #+# #+# */ /* Created: 2019/03/03 11:41:49 by tmaze #+# #+# */
/* Updated: 2019/03/08 18:02:31 by tmaze ### ########.fr */ /* Updated: 2019/03/09 17:44:01 by tmaze ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -28,6 +28,80 @@ void mark_groups(t_psdata *data)
} }
} }
void get_min_max(t_psdata *data, int *min_max, int *ind_min_max)
{
t_stack *ptr;
int i;
min_max[0] = FT_INT_MAX;
min_max[1] = FT_INT_MIN;
ptr = data->a;
i = 0;
while (ptr)
{
if (ptr->nb < min_max[0] && (ind_min_max[0] = i) == i)
min_max[0] = ptr->nb;
if (ptr->nb > min_max[1] && (ind_min_max[1] = i) == i)
min_max[1] = ptr->nb;
i++;
ptr = ptr->next;
}
}
void sortfor3(t_psdata *data)
{
int min_max[2];
int ind_min_max[2];
get_min_max(data, min_max, ind_min_max);
while (ind_min_max[0] != 0 || ind_min_max[1] != 2)
{
if (ind_min_max[0] == ind_min_max[1] - 1)
ft_printf("sa\n");
if (ind_min_max[0] == ind_min_max[1] - 1)
ps_swap(data, 'a');
if (ind_min_max[1] == 0)
ft_printf("ra\n");
if (ind_min_max[1] == 0)
ps_rot(data, 'a');
if (ind_min_max[0] == 2 && ind_min_max[1] == 1)
ft_printf("rra\n");
if (ind_min_max[0] == 2 && ind_min_max[1] == 1)
ps_rerot(data, 'a');
get_min_max(data, min_max, ind_min_max);
}
}
void sortfor5(t_psdata *data)
{
ft_printf("pb\n");
ps_push(data, 'b');
ft_printf("pb\n");
ps_push(data, 'b');
if (data->b->nb > data->b->next->nb)
{
ft_printf("sb\n");
ps_swap(data, 'b');
}
sortfor3(data);
data->b->ind = 1;
data->b->next->ind = 1;
data->a->ind = 2;
data->a->next->ind = 2;
data->a->next->next->ind = 2;
while (data->a->ind == 2 || data->size_b > 0)
{
if (data->a->ind != 2 || (data->size_b > 0 && data->b->nb < data->a->nb))
{
ft_printf("pa\n");
ps_push(data, 'a');
}
data->a->ind = 3;
ft_printf("ra\n");
ps_rot(data, 'a');
}
}
void sort2(t_psdata *data) void sort2(t_psdata *data)
{ {
t_stack *ptr; t_stack *ptr;
@ -56,6 +130,13 @@ void sort2(t_psdata *data)
ps_rot(data, 'b'); ps_rot(data, 'b');
} }
inds = data->a->ind; inds = data->a->ind;
if (data->size_a == 3)
{
sortfor3(data);
data->a->ind = inds;
data->a->next->ind = inds;
data->a->next->next->ind = inds;
}
while (inds == data->a->ind || data->size_b > 0) while (inds == data->a->ind || data->size_b > 0)
{ {
if (data->a->ind != inds || (data->size_b > 0 && data->b->nb < data->a->nb)) if (data->a->ind != inds || (data->size_b > 0 && data->b->nb < data->a->nb))
@ -166,35 +247,27 @@ int main(int ac, char **av)
ptr->ind = 0; ptr->ind = 0;
ptr = ptr->next; ptr = ptr->next;
} }
if (data.size_a == 3)
{
sortfor3(&data);
ps_stkclean(&data);
return (0);
}
else if (data.size_a == 5)
{
sortfor5(&data);
ps_stkclean(&data);
return (0);
}
mark_groups(&data); mark_groups(&data);
ptr = data.a; ptr = data.a;
i = 0; i = 0;
while (ptr) while (ptr)
{ {
// ft_printf("@ind: %d nb: %d ind: %d\n", i, ptr->nb, ptr->ind);
ptr = ptr->next; ptr = ptr->next;
i++; i++;
} }
sort2(&data); sort2(&data);
/* if (!sort(&data, data.size_a)) */
/* { */
/* printf("Error\n"); */
/* ps_stkclean(&data); */
/* return (1); */
/* } */
ptr = data.a;
while (ptr)
{
// ft_printf("%d\n", ptr->nb);
if (ptr->next && ptr->nb > ptr->next->nb)
{
// ft_printf("KO\n");
ps_stkclean(&data);
return (0);
}
ptr = ptr->next;
}
// ft_printf("OK\n");
ps_stkclean(&data); ps_stkclean(&data);
return (0); return (0);
} }