Ordenar una array casi ordenada (o K ordenada) | Conjunto 2 (Método Gap – Clasificación Shell)

Dada una array , arr[] de N elementos, donde cada elemento está como máximo a K de su posición de destino, la tarea es diseñar un algoritmo que ordene en tiempo O(N*log(K)) .

Ejemplos:

Entrada: arr[] = {10, 9, 8, 7, 4, 70, 60, 50}, K = 4
Salida: 4 7 8 9 10 50 60 70
Explicación:
siga los pasos a continuación para ordenar la array:

  1. Comience con Gap = K (es decir, 4)
    • 10 9 8 7 4 70 60 50, intercambie los elementos en los índices 0 y 4. Luego, la array se modifica a {4, 9, 8, 7, 10, 70, 60, 50}.
      4 9 8 7 10 70 60 50, No intercambie los elementos en los índices 1 y 5.
      4 9 8 7 10 70 60 50, No intercambie los elementos en los índices 2 y 6.
      4 9 8 7 10 70 60 50, Sí no intercambie los elementos en los índices 3 y 7.
  2. Brecha = techo de 4/2 = 2
    • 4 9 8 7 10 70 60 50, no intercambie los elementos en los índices 0 y 2.
      4 9 8 7 10 70 60 50, intercambie los elementos en los índices 1 y 3. Luego, la array se modifica a {4, 7, 8, 9, 10, 70, 60, 50}.
      4 7 8 9 10 70 60 50, No intercambie los elementos en los índices 2 y 4.
      4 7 8 9 10 70 60 50, No intercambie los elementos en los índices 3 y 5.
      4 7 8 9 10 70 60 50, Sí no intercambie los elementos en los índices 4 y 6.
      4 7 8 9 10 70 60 50,intercambie los elementos en los índices 5 y 7. Luego, la array se modifica a {4, 7, 8, 9, 10, 70, 60, 50}.
      4 7 8 9 10 50 60 70
  3. Brecha = techo de 2/2 = 1
    • 4 7 8 9 10 50 60 70, No intercambie los elementos en los índices 0 y 1.
      4 7 8 9 10 50 60 70, No intercambie los elementos en los índices 1 y 2.
      4 7 8 9 10 50 60 70, Sí no intercambie los elementos en los índices 2 y 3.
      4 7 8 9 10 50 60 70, No intercambie los elementos en los índices 3 y 4.
      4 7 8 9 10 50 60 70, No intercambie los elementos en los índices 4 y 5.
      4 7 8 9 10 50 60 70, No intercambie los elementos en los índices 5 y 6.
      4 7 8 9 10 50 60 70, No intercambie los elementos en los índices 6 y 7.

Entrada: arr[] = {6, 5, 3, 2, 8, 10, 9}, K = 3  
Salida: 2 3 5 6 8 9 10

Enfoque: El problema dado Ordenar una array casi ordenada (o K ordenada) ya está resuelto. Aquí la idea es usar la ordenación de shell para ordenar la array. La idea utilizada aquí es similar al paso de fusión de In-Place Merge Sort . Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos Gap con un valor K para ordenar cada elemento Gap de cada sublista .
  • Iterar hasta que Gap sea mayor que 0 y realizar los siguientes pasos:
    • Itere sobre el rango [0, N-Gap] usando la variable i , y en cada iteración, si arr[i] es mayor que arr[i+Gap], entonces intercambie los elementos de la array.
    • Actualice el Gap como Gap = ceil (Gap/2).
  • Finalmente, después de completar el paso anterior, imprima los elementos de la array arr[] .

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the nextGap
int nextGap(double k)
{
    if (k < 2)
        return 0;
    return ceil(k / 2);
}
 
// A utility function to print the array
void printArray(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
}
// Function to sort a K sorted array
void kSort(int arr[], int K, int n)
{
   
    // Iterate until gap is atleast
    // greater than 0
    for (int gap = K; gap > 0; gap = nextGap(gap)) {
 
        // Iterate over the range [0, N]
        for (int i = 0; i + gap < n; i++) {
 
            // If arr[i] is greater
            // than arr[i+gap]
            if (arr[i] > arr[i + gap]) {
 
                // Swap arr[i] and
                // arr[i+gap]
                swap(arr[i], arr[i + gap]);
            }
        }
    }
    printArray(arr, n);
}
 
// Driver Code
int main()
{
 
    // Input
    int arr[] = { 10, 9, 8, 7, 4, 70, 60, 50 };
    int K = 3;
    int n = sizeof(arr) / sizeof(arr[0]);
   
    // Function call
    kSort(arr, K, n);
    return 0;
}
 
// This code is contributed by lokesh potta.

Java

// Java program for the above approach
import java.util.Iterator;
import java.util.PriorityQueue;
 
class GFG {
 
    // Function to sort a K sorted array
    static void kSort(int[] arr, int K)
    {
        // Iterate until gap is atleast
        // greater than 0
        for (int gap = K; gap > 0; gap = nextGap(gap)) {
 
            // Iterate over the range [0, N]
            for (int i = 0; i + gap < arr.length; i++) {
 
                // If arr[i] is greater
                // than arr[i+gap]
                if (arr[i] > arr[i + gap]) {
 
                    // Swap arr[i] and
                    // arr[i+gap]
                    swap(arr, i, i + gap);
                }
            }
        }
        printArray(arr);
    }
 
    // Function to find the nextGap
    static int nextGap(double k)
    {
        if (k < 2)
            return 0;
        return (int)Math.ceil(k / 2);
    }
 
    // Function to swap two elements
    // of the array arr[]
    static void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 
    // A utility function to print the array
    private static void printArray(int[] arr)
    {
        for (int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // Input
        int arr[] = { 10, 9, 8, 7, 4, 70, 60, 50 };
        int K = 3;
 
        // Function call
        kSort(arr, K);
    }
}

Python3

# Python3 program for the above approach
import math
 
# Function to find the nextGap
def nextGap(k):
     
    if (k < 2):
        return 0
         
    return math.ceil(k / 2)
 
# A utility function to print array
def printArray(arr, n):
     
    for i in range(n):
        print(arr[i], end = " ")
 
# Function to sort a K sorted array
def kSort(arr, K, n):
   
    # Iterate until gap is atleast
    # greater than 0
    gap = K
     
    while (gap > 0):
         
        # Iterate over the range [0, N]
        i = 0
        while (i + gap < n):
             
            # If arr[i] is greater
            # than arr[i+gap]
            if (arr[i] > arr[i + gap]):
                 
                # Swap arr[i] and
                # arr[i+gap]
                arr[i], arr[i + gap] = arr[i + gap], arr[i]
                 
            i += 1
         
        gap = nextGap(gap)
         
    printArray(arr, n)
 
# Driver Code
 
# Input
arr = [ 10, 9, 8, 7, 4, 70, 60, 50 ]
K = 3
n = len(arr)
   
# Function call
kSort(arr, K, n)
 
# This code is contributed by target_2

C#

// C# program for the above approach
using System;
 
class GFG {
 
    // Function to sort a K sorted array
    static void kSort(int[] arr, int K)
    {
        // Iterate until gap is atleast
        // greater than 0
        for (int gap = K; gap > 0; gap = nextGap(gap)) {
 
            // Iterate over the range [0, N]
            for (int i = 0; i + gap < arr.Length; i++) {
 
                // If arr[i] is greater
                // than arr[i+gap]
                if (arr[i] > arr[i + gap]) {
 
                    // Swap arr[i] and
                    // arr[i+gap]
                    swap(arr, i, i + gap);
                }
            }
        }
        printArray(arr);
    }
 
    // Function to find the nextGap
    static int nextGap(double k)
    {
        if (k < 2)
            return 0;
        return (int)Math.Ceiling(k / 2);
    }
 
    // Function to swap two elements
    // of the array arr[]
    static void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 
    // A utility function to print the array
    private static void printArray(int[] arr)
    {
        for (int i = 0; i < arr.Length; i++)
            Console.Write(arr[i] + " ");
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        // Input
        int []arr = { 10, 9, 8, 7, 4, 70, 60, 50 };
        int K = 3;
 
        // Function call
        kSort(arr, K);
    }
}
 
// This code is contributed by ukasp.

Javascript

<script>
 
// Javascript program for the above approach
 
// Function to find the nextGap
function nextGap(k)
{
    if (k < 2)
        return 0;
         
    return Math.ceil(k / 2);
}
 
// A utility function to print the array
function printArray(arr, n)
{
    for(let i = 0; i < n; i++)
        document.write(arr[i] + " ");
}
 
// Function to sort a K sorted array
function kSort(arr, K, n)
{
     
    // Iterate until gap is atleast
    // greater than 0
    for(let gap = K; gap > 0; gap = nextGap(gap))
    {
         
        // Iterate over the range [0, N]
        for(let i = 0; i + gap < n; i++)
        {
             
            // If arr[i] is greater
            // than arr[i+gap]
            if (arr[i] > arr[i + gap])
            {
                 
                // Swap arr[i] and
                // arr[i+gap]
                let temp = arr[i];
                arr[i] = arr[i + gap];
                arr[i + gap] = temp;
            }
        }
    }
    printArray(arr, n);
}
 
// Driver Code
 
// Input
let arr = [ 10, 9, 8, 7, 4, 70, 60, 50 ];
let K = 3;
let n = arr.length;
 
// Function call
kSort(arr, K, n);
 
// This code is contributed by _saurabh_jaiswal
 
</script>
Producción

4 7 8 9 10 50 60 70 

Complejidad de tiempo: O(N*log K)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por mittulmandhan 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 *