/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   compress.c                                         :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: nkawaguc <nkawaguc@student.42tokyo.jp>     +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2024/10/14 14:49:53 by nkawaguc          #+#    #+#             */
/*   Updated: 2024/10/19 16:52:47 by nkawaguc         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "push_swap.h"
#include <stdio.h>

static void	quick_sort(int *arr, int left, int right);
static void	ft_swap(int *a, int *b);

void	compress(int *arr, int size)
{
	int	*arr_sorted;
	int	i;

	arr_sorted = (int *)malloc(sizeof(int) * size);
	if (arr_sorted == NULL)
		error();
	i = -1;
	while (++i < size)
		arr_sorted[i] = arr[i];
	quick_sort(arr_sorted, 0, size);
	if (is_duplicated(arr_sorted, size))
		error();
	i = -1;
	while (++i < size)
		arr[i] = lower_bound(arr_sorted, size, arr[i]);
	free(arr_sorted);
}

static void	quick_sort(int *arr, int left, int right)
{
	int	pivot;
	int	i;
	int	j;

	if (left + 1 >= right)
		return ;
	ft_swap(&arr[left], &arr[(left + right) / 2]);
	pivot = arr[left];
	i = left + 1;
	j = right - 1;
	while (1)
	{
		while (i < right && arr[i] <= pivot)
			i++;
		while (left <= j && pivot < arr[j])
			j--;
		if (i >= j)
			break ;
		ft_swap(&arr[i], &arr[j]);
	}
	if (left < j)
		ft_swap(&arr[left], &arr[j]);
	quick_sort(arr, left, j);
	quick_sort(arr, j + 1, right);
}

static void	ft_swap(int *a, int *b)
{
	int	tmp;

	tmp = *a;
	*a = *b;
	*b = tmp;
}