Ordenar una array según la diferencia absoluta con el valor dado

Dada una array de n elementos distintos y un número x, organice los elementos de la array de acuerdo con la diferencia absoluta con x, es decir, un elemento que tenga una diferencia mínima aparece primero, y así sucesivamente. 
Nota: si dos o más elementos están a la misma distancia, organícelos en la misma secuencia que en la array dada.
Ejemplos: 

Input : arr[] : x = 7, arr[] = {10, 5, 3, 9, 2}
Output : arr[] = {5, 9, 10, 3, 2}
Explanation:
7 - 10 = 3(abs)
7 - 5 = 2
7 - 3 = 4 
7 - 9 = 2(abs)
7 - 2 = 5
So according to the difference with X, 
elements are arranged as 5, 9, 10, 3, 2.

Input : x = 6, arr[] = {1, 2, 3, 4, 5}   
Output :  arr[] = {5, 4, 3, 2, 1}

Input : x = 5, arr[] = {2, 6, 8, 3}   
Output :  arr[] = {6, 3, 2, 8}

La idea es utilizar un árbol de búsqueda binario autoequilibrado. Atravesamos la array de entrada y para cada elemento, encontramos su diferencia con x y almacenamos la diferencia como clave y el elemento como el valor en un árbol de búsqueda binario autoequilibrado. Finalmente, recorremos el árbol e imprimimos su recorrido en orden, que es la salida requerida.
Implementación de C++: 
en C++, el árbol de búsqueda binaria de autoequilibrio se implementa mediante set , map y multimap . No podemos usar set aquí ya que tenemos pares clave-valor (no solo claves). Tampoco podemos usar el mapa directamente, ya que una sola clave puede pertenecer a múltiples valores y el mapa permite un solo valor para una clave. Entonces usamos multimapa que almacena pares clave-valor y puede tener múltiples valores para una clave.

  1. Almacene los valores en el mapa múltiple con la diferencia con X como clave.
  2. En multimapa, los valores ya estarán ordenados según la clave, es decir, la diferencia con X porque implementa el árbol de búsqueda binaria de autoequilibrio internamente.
  3. Actualice todos los valores de una array con los valores del mapa para que la array tenga la salida requerida.

C++

// C++ program to sort an array according absolute
// difference with x.
#include<bits/stdc++.h>
using namespace std;
 
// Function to sort an array according absolute
// difference with x.
void rearrange(int arr[], int n, int x)
{
    multimap<int, int> m;
    multimap<int ,int >:: iterator it;
    // Store values in a map with the difference
    // with X as key
    for (int i = 0 ; i < n; i++)
        m.insert(make_pair(abs(x-arr[i]),arr[i]));
 
    // Update the values of array
    int i = 0;
    for (it = m.begin(); it != m.end(); it++)
        arr[i++] = (*it).second ;
}
 
// Function to print the array
void printArray(int arr[] , int n)
{
    for (int i = 0 ; i < n; i++)
        cout << arr[i] << " ";
}
 
// Driver code
int main()
{
    int arr[] = {10, 5, 3, 9 ,2};
    int n = sizeof(arr)/sizeof(arr[0]);
    int x = 7;
    rearrange(arr, n, x);
    printArray(arr, n);
    return 0;
}

Java

// Java program to sort an array according absolute
// difference with x.
import java.io.*;
import java.util.*;
 
class GFG
{
 
    // Function to sort an array according absolute
    // difference with x.
    static void rearrange(int[] arr, int n, int x)
    {
            TreeMap<Integer, ArrayList<Integer>> m =
                                    new TreeMap<>();
             
            // Store values in a map with the difference
            // with X as key
            for (int i = 0; i < n; i++)
            {
                int diff = Math.abs(x - arr[i]);
                if (m.containsKey(diff))
                {
                    ArrayList<Integer> al = m.get(diff);
                    al.add(arr[i]);
                    m.put(diff, al);
                }
                else
                {
                        ArrayList<Integer> al = new
                                       ArrayList<>();
                        al.add(arr[i]);
                        m.put(diff,al);
                }
            }
 
            // Update the values of array
            int index = 0;
            for (Map.Entry entry : m.entrySet())
            {
                ArrayList<Integer> al = m.get(entry.getKey());
                for (int i = 0; i < al.size(); i++)
                        arr[index++] = al.get(i);
            }
    }
 
    // Function to print the array
    static void printArray(int[] arr, int n)
    {
            for (int i = 0; i < n; i++)
                System.out.print(arr[i] + " ");
    }
 
    // Driver code
    public static void main(String args[])
    {
            int[] arr = {10, 5, 3, 9 ,2};
            int n = arr.length;
            int x = 7;
            rearrange(arr, n, x);
            printArray(arr, n);
    }
}
 
// This code is contributed by rachana soma

Python3

# Python3 program to sort an
# array according absolute
# difference with x.
 
# Function to sort an array
# according absolute difference
# with x.
def rearrange(arr, n, x):
 
    m = {}
 
    # Store values in a map
    # with the difference
    # with X as key
    for i in range(n):
        m[arr[i]] = abs(x - arr[i])
 
    m = {k : v for k, v in sorted(m.items(),
         key = lambda item : item[1])}
 
    # Update the values of array
    i = 0
 
    for it in m.keys():
        arr[i] = it
        i += 1
 
# Function to print the array
def printArray(arr, n):
 
    for i in range(n):
        print(arr[i], end = " ")
         
# Driver code
if __name__ == "__main__":
 
    arr = [10, 5, 3, 9, 2]
    n = len(arr)
    x = 7
    rearrange(arr, n, x)
    printArray(arr, n)
 
# This code is contributed by Chitranayal

C#

// C# program to sort an array according absolute
// difference with x.
using System;
using System.Collections.Generic;
 
public class GFG
{
 
  // Function to sort an array according absolute
  // difference with x.
  static void rearrange(int[] arr, int n, int x)
  {
    SortedDictionary<int,List<int>> m = new SortedDictionary<int,List<int>>();
 
    // Store values in a map with the difference
    // with X as key
    for (int i = 0; i < n; i++)
    {
      int diff = Math.Abs(x - arr[i]);
      if (m.ContainsKey(diff))
      {
        List<int> al = m;
        al.Add(arr[i]);
        m = al;
      }
      else
      {
        List<int> al = new  List<int>();
        al.Add(arr[i]);
        m.Add(diff, al);
      }
    }
    // Update the values of array
    int index = 0;
    foreach(int entry in m.Keys)
    {
      List<int> al = m[entry];
      for (int i = 0; i < al.Count; i++)
        arr[index++] = al[i];
    }
  }
 
  // Function to print the array
  static void printArray(int[] arr, int n)
  {
    for (int i = 0; i < n; i++)
      Console.Write(arr[i] + " ");
  }
 
  // Driver code
  static public void Main (){
    int[] arr = {10, 5, 3, 9 ,2};
    int n = arr.Length;
    int x = 7;
    rearrange(arr, n, x);
    printArray(arr, n);
  }
}
 
// This code is contributed by avanitrachhadiya2155

Javascript

<script>
 
// JavaScript program to sort an array according absolute
// difference with x.
 
// Function to sort an array according absolute
// difference with x.
function rearrange(arr,n,x)
{
    let m = new Map();
     
    // Store values in a map with the difference
            // with X as key
            for (let i = 0; i < n; i++)
            {
                m.set(arr[i],Math.abs(x-arr[i]));
            }
              
            let m1 = new Map([...m.entries()].sort((a, b) =>
            a[1] - b[1]));
             
            // Update the values of array
            let index = 0;
            for (let [key, value] of m1.entries())
            {
                arr[index++] =key
            }
}
 
// Function to print the array
function printArray(arr,n)
{
    for (let i = 0; i < n; i++)
        document.write(arr[i] + " ");
}
 
// Driver code
let arr=[10, 5, 3, 9 ,2];
let n = arr.length;
let x = 7;
rearrange(arr, n, x);
printArray(arr, n);
 
// This code is contributed by ab2127
 
</script>
Producción

5 9 10 3 2 

Complejidad de tiempo: O(n Log n) 
Espacio auxiliar: O(n)
Este artículo es una contribución de Sahil Chhabra . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Implementación basada en C++ STL : en C++, podemos usar stable_sort() y escribir una expresión lambda para la función de comparación personalizada. Esta solución es elegante y mucho más fácil de entender. El único desafío al escribir la expresión lambda es enviar el valor ‘x’ a la expresión lambda para poder usarlo dentro de la expresión. Esto se puede lograr mediante la sobrecarga de operadores con la ayuda de una clase o utilizando una captura mucho más simple.

C++

// CPP program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
void rearrange(int arr[], int n, int x)
{
    /*
        We can send the value x into
        lambda expression as
        follows: [capture]()
        {
            //statements
            //capture value can be used inside
        }
    */
    stable_sort(arr, arr + n, [x](int a, int b)
    {
        if (abs(a - x) < abs(b - x))
            return true;
        else
            return false;
    });
}
 
// Driver code
int main()
{
    int arr[] = { 10, 5, 3, 9, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 7;
    rearrange(arr, n, x);
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    return 0;
}
Producción

5 9 10 3 2 

Complejidad de tiempo : dado que estamos usando un tipo estable de STL, que usa una variación de ordenación por fusión, la complejidad de tiempo es O (n logn).

Este artículo es una contribución de D. Mohit Varsha. Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *