HeapSort iterativo

HeapSort es una técnica de clasificación basada en la comparación en la que primero construimos Max Heap y luego intercambiamos el elemento raíz con el último elemento (tamaño veces) y mantenemos la propiedad del montón cada vez para finalmente ordenarlo. 

Ejemplos:

Input :  10 20 15 17 9 21
Output : 9 10 15 17 20 21 

Input:  12 11 13 5 6 7 15 5 19
Output: 5 5 6 7 11 12 13 15 19 

En el primer ejemplo, primero tenemos que construir Max Heap. 

Entonces, comenzaremos desde 20 como niño y buscaremos a su padre. Aquí 10 es más pequeño, así que intercambiaremos estos dos. 

Ahora, 20 10 15 17 9 21 

Ahora, el hijo 17 es mayor que su padre 10. Entonces, ambos se intercambiarán y el orden será 20 17 15 10 9 21 

Ahora, el hijo 21 es mayor que el padre 15. Entonces, ambos se intercambiarán. 

20 17 21 10 9 15 

Ahora, nuevamente 21 es más grande que el padre 20. Entonces, 21 17 20 10 9 15 

Este es Max Heap. 

Ahora, tenemos que aplicar la ordenación. Aquí, tenemos que intercambiar el primer elemento con el último y tenemos que mantener la propiedad Max Heap. Entonces, después del primer intercambio: 15 17 20 10 9 21 Claramente viola la propiedad Max Heap. 

Entonces, tenemos que mantenerlo. Entonces, el orden será 

20 17 15 10 9 21 

17 10 15 9 20 21 

15 10 9 17 20 21 

10 9 15 17 20 21 

9 10 15 17 20 21 

Aquí, la parte subrayada es parte ordenada.

C++

// C++ program for implementation
// of Iterative Heap Sort
#include <bits/stdc++.h>
using namespace std;
 
// function build Max Heap where value
// of each child is always smaller
// than value of their parent
void buildMaxHeap(int arr[], int n)
{
    for (int i = 1; i < n; i++)
    {
        // if child is bigger than parent
        if (arr[i] > arr[(i - 1) / 2])
        {
            int j = i;
     
            // swap child and parent until
            // parent is smaller
            while (arr[j] > arr[(j - 1) / 2])
            {
                swap(arr[j], arr[(j - 1) / 2]);
                j = (j - 1) / 2;
            }
        }
    }
}
 
void heapSort(int arr[], int n)
{
    buildMaxHeap(arr, n);
 
    for (int i = n - 1; i > 0; i--)
    {
        // swap value of first indexed
        // with last indexed
        swap(arr[0], arr[i]);
     
        // maintaining heap property
        // after each swapping
        int j = 0, index;
         
        do
        {
            index = (2 * j + 1);
             
            // if left child is smaller than
            // right child point index variable
            // to right child
            if (arr[index] < arr[index + 1] &&
                                index < (i - 1))
                index++;
         
            // if parent is smaller than child
            // then swapping parent with child
            // having higher value
            if (arr[j] < arr[index] && index < i)
                swap(arr[j], arr[index]);
         
            j = index;
         
        } while (index < i);
    }
}
 
// Driver Code to test above
int main()
{
    int arr[] = {10, 20, 15, 17, 9, 21};
    int n = sizeof(arr) / sizeof(arr[0]);
     
    printf("Given array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
         
    printf("\n\n");
 
    heapSort(arr, n);
 
    // print array after sorting
    printf("Sorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
 
    return 0;
}

C

// C program for implementation
// of Iterative Heap Sort
#include <stdio.h>
 
// function build Max Heap where value
// of each child is always smaller
// than value of their parent
void buildMaxHeap(int arr[], int n)
{
    for (int i = 1; i < n; i++)
    {
        // if child is bigger than parent
        if (arr[i] > arr[(i - 1) / 2])
        {
            int j = i;
     
            // swap child and parent until
            // parent is smaller
            while (arr[j] > arr[(j - 1) / 2])
            {
                int temp=arr[j];
                arr[j]=arr[(j-1)/2];
                arr[(j-1)/2]=temp;
                j = (j - 1) / 2;
            }
        }
    }
}
 
void heapSort(int arr[], int n)
{
    buildMaxHeap(arr, n);
 
    for (int i = n - 1; i > 0; i--)
    {
        // swap value of first indexed
        // with last indexed
        int temp=arr[0];
        arr[0]=arr[i];
        arr[i]=temp;
     
        // maintaining heap property
        // after each swapping
        int j = 0, index;
         
        do
        {
            index = (2 * j + 1);
             
            // if left child is smaller than
            // right child point index variable
            // to right child
            if (arr[index] < arr[index + 1] &&
                                index < (i - 1))
                index++;
         
            // if parent is smaller than child
            // then swapping parent with child
            // having higher value
            if (arr[j] < arr[index] && index < i)
            {
                int tem1=arr[j];
                arr[j]=arr[index];
                arr[index]=tem1;
            }
         
            j = index;
         
        } while (index < i);
    }
}
 
// Driver Code to test above
int main()
{
    int arr[] = {10, 20, 15, 17, 9, 21};
    int n = sizeof(arr) / sizeof(arr[0]);
     
    printf("Given array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
         
    printf("\n\n");
 
    heapSort(arr, n);
 
    // print array after sorting
    printf("Sorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
 
    return 0;
}

Java

// Java implementation of Iterative Heap Sort
public class HeapSort {
 
  // function build Max Heap where value
  // of each child is always smaller
  // than value of their parent
  static void buildMaxHeap(int arr[], int n)
  {
    for (int i = 1; i < n; i++)
    {
      // if child is bigger than parent
      if (arr[i] > arr[(i - 1) / 2])
      {
        int j = i;
 
        // swap child and parent until
        // parent is smaller
        while (arr[j] > arr[(j - 1) / 2])
        {
          swap(arr, j, (j - 1) / 2);
          j = (j - 1) / 2;
        }
      }
    }
  }
 
  static void heapSort(int arr[], int n)
  {
    buildMaxHeap(arr, n);
 
    for (int i = n - 1; i > 0; i--)
    {
      // swap value of first indexed
      // with last indexed
      swap(arr, 0, i);
 
      // maintaining heap property
      // after each swapping
      int j = 0, index;
 
      do
      {
        index = (2 * j + 1);
 
        // if left child is smaller than
        // right child point index variable
        // to right child
        if (index < (i - 1) && arr[index] < arr[index + 1])
          index++;
 
        // if parent is smaller than child
        // then swapping parent with child
        // having higher value
        if (index < i && arr[j] < arr[index])
          swap(arr, j, index);
 
        j = index;
 
      } while (index < i);
    }
  }
 
  public static void swap(int[] a, int i, int j) {
    int temp = a[i];
    a[i]=a[j];
    a[j] = temp;
  }
 
  /* A utility function to print array of size n */
  static void printArray(int arr[])
  {
    int n = arr.length;
    for (int i = 0; i < n; i++)
      System.out.print(arr[i] + " ");
    System.out.println();
  }
 
  // Driver program
  public static void main(String args[])
  {
    int arr[] = {10, 20, 15, 17, 9, 21};
    int n = arr.length;
 
    System.out.print("Given array: ");
    printArray(arr);
 
    heapSort(arr, n);
 
    System.out.print("Sorted array: ");
    printArray(arr);
  }
}

Python3

# Python3 program for implementation
# of Iterative Heap Sort
 
# function build Max Heap where value
# of each child is always smaller
# than value of their parent
def buildMaxHeap(arr, n):
 
    for i in range(n):
         
        # if child is bigger than parent
        if arr[i] > arr[int((i - 1) / 2)]:
            j = i
     
            # swap child and parent until
            # parent is smaller
            while arr[j] > arr[int((j - 1) / 2)]:
                (arr[j],
                 arr[int((j - 1) / 2)]) = (arr[int((j - 1) / 2)],
                                           arr[j])
                j = int((j - 1) / 2)
 
def heapSort(arr, n):
 
    buildMaxHeap(arr, n)
 
    for i in range(n - 1, 0, -1):
         
        # swap value of first indexed
        # with last indexed
        arr[0], arr[i] = arr[i], arr[0]
     
        # maintaining heap property
        # after each swapping
        j, index = 0, 0
         
        while True:
            index = 2 * j + 1
             
            # if left child is smaller than
            # right child point index variable
            # to right child
            if (index < (i - 1) and
                arr[index] < arr[index + 1]):
                index += 1
         
            # if parent is smaller than child
            # then swapping parent with child
            # having higher value
            if index < i and arr[j] < arr[index]:
                arr[j], arr[index] = arr[index], arr[j]
         
            j = index
            if index >= i:
                break
 
# Driver Code
if __name__ == '__main__':
    arr = [10, 20, 15, 17, 9, 21]
    n = len(arr)
     
    print("Given array: ")
    for i in range(n):
        print(arr[i], end = " ")
         
    print()
 
    heapSort(arr, n)
 
    # print array after sorting
    print("Sorted array: ")
    for i in range(n):
        print(arr[i], end = " ")
 
# This code is contributed by PranchalK

C#

// C# implementation of Iterative Heap Sort
using System;
     
class HeapSort
{
 
// function build Max Heap where value
// of each child is always smaller
// than value of their parent
static void buildMaxHeap(int []arr, int n)
{
    for (int i = 1; i < n; i++)
    {
        // if child is bigger than parent
        if (arr[i] > arr[(i - 1) / 2])
        {
            int j = i;
     
            // swap child and parent until
            // parent is smaller
            while (arr[j] > arr[(j - 1) / 2])
            {
                swap(arr, j, (j - 1) / 2);
                j = (j - 1) / 2;
            }
        }
    }
}
 
static void heapSort(int []arr, int n)
{
    buildMaxHeap(arr, n);
 
    for (int i = n - 1; i > 0; i--)
    {
         
        // swap value of first indexed
        // with last indexed
        swap(arr, 0, i);
     
        // maintaining heap property
        // after each swapping
        int j = 0, index;
     
        do
        {
            index = (2 * j + 1);
     
            // if left child is smaller than
            // right child point index variable
            // to right child
            if (index < (i - 1) && arr[index] <
                                   arr[index + 1])
            index++;
     
            // if parent is smaller than child
            // then swapping parent with child
            // having higher value
            if (index < i && arr[j] < arr[index])
                swap(arr, j, index);
     
            j = index;
     
        } while (index < i);
    }
}
 
public static void swap(int[] a, int i, int j)
{
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}
 
/* A utility function to print array of size n */
static void printArray(int []arr)
{
    int n = arr.Length;
    for (int i = 0; i < n; i++)
    Console.Write(arr[i] + " ");
    Console.WriteLine();
}
 
// Driver Code
public static void Main(String []args)
{
    int []arr = {10, 20, 15, 17, 9, 21};
    int n = arr.Length;
 
    Console.Write("Given array: ");
    printArray(arr);
 
    heapSort(arr, n);
 
    Console.Write("Sorted array: ");
    printArray(arr);
}
}
 
// This code is contributed by Princi Singh

Javascript

<script>
// javascript program for implementation
// of Iterative Heap Sort
 
function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
 
// function build Max Heap where value
// of each child is always smaller
// than value of their parent
function buildMaxHeap(arr, n) {
    for(let i=1;i<n;i++)
    {
        // if child is bigger than parent
        if (arr[i] > arr[(i - 1) / 2])
        {
            let j = i;
     
            // swap child and parent until
            // parent is smaller
            while (arr[j] > arr[(j - 1) / 2])
            {
                swap(arr,j,(j-1)/2);
                j = (j - 1) / 2;
            }
        }
    }
}
  
 
function heapSort(arr, n) {
     
    buildMaxHeap(arr,n);
     
    for (let i = n - 1; i > 0; i--)
    {
        // swap value of first indexed
        // with last indexed
        swap(arr,0,i);
     
        // maintaining heap property
        // after each swapping
        let j = 0, index;
         
        do
        {
            index = (2 * j + 1);
             
            // if left child is smaller than
            // right child point index variable
            // to right child
            if (arr[index] < arr[index + 1] && index < (i - 1))
            index++;
         
            // if parent is smaller than child
            // then swapping parent with child
            // having higher value
            if (arr[j] < arr[index] && index < i)
                swap(arr, j, index);
         
            j = index;
         
        } while (index < i);
    }
}
  
// Driver Code to test above
let arr = [10, 20, 15, 17, 9, 21];
 
let n = arr.length;
 
document.write("Given array : ");
for (let i = 0; i < n; ++i)
        document.write(arr[i]+" ");
         
document.write("<br>");
 
heapSort(arr,n);
 
// print array after sorting
document.write("Sorted array : ");
for (let i = 0; i < n; ++i)
        document.write(arr[i]+" ");
  
// This code is contributed by aditya942003patil
  
</script>

Producción :

Given array: 10 20 15 17 9 21 

Sorted array: 9 10 15 17 20 21 

Aquí, tanto la función buildMaxHeap como heapSort se ejecutan en tiempo O (nlogn). Entonces, la complejidad del tiempo general es O (nlogn)

Publicación traducida automáticamente

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