Пример #1
0
void	rempile(t_shell *head)
{
	if (l_nb(head->sa) > head->sa->nb)
		ft_rra(head, 1);
	while (l_len(head->sb) > 1)
	{
		if (l_len(head->sb) > 2 && head->sb->nb > head->sb->n->nb &&
head->sb->nb > head->sb->n->n->nb)
			rb_or_rr(head);
		while (is_bigger(head->sa, head->sb->nb, head->min))
			while_bigger(head);
		ft_pa(head, 1);
		if (head->sa->nb > head->sa->n->nb && head->sa->n->nb != head->min)
		{
			if (l_len(head->sb) > 1 && head->sb->nb > head->sb->n->nb)
				ft_ss(head, 1);
			else
				ft_sa(head, 1);
		}
		while (is_smallest(head->sb, head->sa->nb) && !ft_sorted(head->sa))
			while_smallest(head);
	}
	ft_pa(head, 1);
	if (head->sa->nb > head->sa->n->nb && head->sa->n->nb != head->min)
		ft_sa(head, 1);
	ft_ra(head, 1);
}
Пример #2
0
void	ft_algo20(int mid, t_nb *nb, int list_a[nb->nba], int list_b[nb->nbb])
{
	int smallnb;

	smallnb = ft_find_smallnb(nb->nba, list_a);
	if (ft_perfect(nb, list_a, 0))
		while (nb->nbb != 0)
			ft_pa(nb, list_a, list_b);
	if (ft_perfect(nb, list_a, 0))
		return ;
	if (ft_smallnb(nb->nba, list_a, 0, nb->nba - 2) == 1)
		ft_sa(nb, list_a, list_b);
	if (smallnb >= mid && ft_smallnb(nb->nba, list_a, 0, nb->nba - 1) == 0)
		while (ft_smallnb(nb->nba, list_a, 0, nb->nba - 1) == 0)
			ft_ra(nb, list_a, list_b);
	else if (smallnb < mid && ft_smallnb(nb->nba, list_a, 0, nb->nba - 1) == 0)
		while (ft_smallnb(nb->nba, list_a, 0, nb->nba - 1) == 0)
			ft_rra(nb, list_a, list_b);
	if (ft_smallnb(nb->nba, list_a, 0, nb->nba - 1) && nb->nba > 3 &&
	ft_perfect(nb, list_a, 0) == 0)
		ft_pb(nb, list_a, list_b);
	if (nb->nba <= 3)
		ft_algo3(nb, list_a, list_b);
	if (nb->nba <= 3)
		while (nb->nbb != 0)
			ft_pa(nb, list_a, list_b);
	ft_algo20(mid, nb, list_a, list_b);
}
Пример #3
0
int				ft_f(int f, t_ps *ps)
{
	if (f == SA)
		return (ft_sa(ps));
	else if (f == SB)
		return (ft_sb(ps));
	else if (f == SS)
		return (ft_ss(ps));
	else if (f == PB)
		return (ft_pb(ps));
	else if (f == PA)
		return (ft_pa(ps));
	else if (f == RA)
		return (ft_ra(ps));
	else if (f == RB)
		return (ft_rb(ps));
	else if (f == RR)
		return (ft_rr(ps));
	else if (f == RRA)
		return (ft_rra(ps));
	else if (f == RRB)
		return (ft_rrb(ps));
	else if (f == RRR)
		return (ft_rrr(ps));
	return (0);
}
Пример #4
0
void	ft_algofusion2(t_nb *nb, int list_a[nb->nba], int list_b[nb->nbb])
{
	if (ft_find_bignb(nb->nbb, list_b) >= ft_middle(nb->nbb))
	{
		while (ft_bignb(nb->nbb, list_b, 0, nb->nbb - 1) == 0)
			ft_rb(nb, list_b, list_a);
		ft_pa(nb, list_a, list_b);
		if (nb->nbinj[nb->i] == 2 && list_a[nb->nba - 1] > list_a[nb->nba - 2])
			ft_sa(nb, list_a, list_b);
	}
	else if (ft_find_bignb(nb->nbb, list_b) < ft_middle(nb->nbb))
	{
		while (ft_bignb(nb->nbb, list_b, 0, nb->nbb - 1) == 0)
			ft_rrb(nb, list_b, list_a);
		ft_pa(nb, list_a, list_b);
		if (nb->nbinj[nb->i] == 2 && list_a[nb->nba - 1] > list_a[nb->nba - 2])
			ft_sa(nb, list_a, list_b);
	}
}
Пример #5
0
int			ft_recus_2(t_push **stacka, t_push **stackb, int i, t_info *info)
{
	if (*stackb != NULL)
	{
		ft_pa(stacka, stackb);
		info->str = ft_strjoin(info->str, "pa ");
		if (ft_recus(stacka, stackb, i - 1, info) == 1)
			return (1);
		info->str = ft_del_last_c(info->str, 3);
		ft_sort_pb(stacka, stackb);
	}
	if (*stacka != NULL)
	{
		ft_sort_pb(stacka, stackb);
		info->str = ft_strjoin(info->str, "pb ");
		if (ft_recus(stacka, stackb, i - 1, info) == 1)
			return (1);
		info->str = ft_del_last_c(info->str, 3);
		ft_pa(stacka, stackb);
	}
	return (0);
}
Пример #6
0
static int		ft_algo_ter(t_ps *b, t_env *env)
{
	int i;
	int biggest_rp;

	i = 0;
	b = env->b_first;
	biggest_rp = ft_biggest_rp(env->b_first);
	while (b->rp != biggest_rp)
	{
		i += ft_rb(env);
		b = env->b_first;
	}
	while (b != NULL)
	{
		i += ft_pa(env);
		b = env->b_first;
	}
	return (i);
}
Пример #7
0
void	push_swap_suite(t_shell *head)
{
	while (l_len(head->sb) > 0)
	{
		while (l_len(head->sb) > 1 &&
				l_nb(head->sb) > head->sb->nb)
			ft_rrb(head, 1);
		ft_pa(head, 1);
		if (l_len(head->sb) > 1 && l_len(head->sa) > 1 &&
head->sa->nb > head->sa->n->nb && head->sb->nb < head->sb->n->nb)
			ft_ss(head, 1);
		else
		{
			if (head->sa->nb > head->sa->n->nb)
				ft_sa(head, 1);
			if (l_len(head->sb) > 1 &&
				head->sb->nb < head->sb->n->nb)
				ft_sb(head, 1);
		}
	}
}
Пример #8
0
void	ft_nba4(int middle, t_nb *nb, int list_a[nb->nba], int list_b[nb->nbb])
{
	int compt;

	compt = middle / 2;
	while (nb->nba == nb->nbinj[nb->i])
	{
		while (nb->nbb != nb->nbinj[0] - nb->nbinj[nb->i - 1])
			ft_pa(nb, list_a, list_b);
		while (ft_find_inf_middlenb(nb, list_a, middle) == 0)
		{
			if (list_a[nb->nba - 1] <= middle)
				ft_pb(nb, list_a, list_b);
			if (list_a[nb->nba - 1] > middle)
				ft_ra(nb, list_a, list_b);
		}
		middle = middle + compt;
		if ((compt / 2) % 2 == 0)
			compt = compt / 2;
		else
			compt = (compt + 1) / 2;
	}
	return ;
}
Пример #9
0
static void				viderl2(t_push *p)
{
	while (p->nbl2 != 0)
		ft_pa(p);
	return ;
}