HeapSort

Heap sort es una técnica de clasificación basada en comparación basada en la estructura de datos Binary Heap. Es similar a la ordenación por selección donde primero encontramos el elemento mínimo y colocamos el elemento mínimo al principio. Repetimos el mismo proceso para los elementos restantes.

¿Qué es el montón binario ? 

Primero definamos un árbol binario completo. Un árbol binario completo es un árbol binario en el que todos los niveles, excepto posiblemente el último, están completamente llenos y todos los Nodes están lo más a la izquierda posible (Fuente Wikipedia )
Un montón binario es un árbol binario completo donde los elementos se almacenan en un ordenar de tal manera que el valor en un Node principal sea mayor (o menor) que los valores en sus dos Nodes secundarios. El primero se llama max heap y el segundo se llama min-heap. El montón se puede representar mediante un árbol binario o una array.

C++

// C++ program for implementation of Heap Sort
#include <iostream>
  
using namespace std;
  
// To heapify a subtree rooted with node i
// which is an index in arr[]. 
// n is size of heap
void heapify(int arr[], int n, int i)
{
    
  // Initialize largest as root
    int largest = i; 
    
  // left = 2*i + 1
    int l = 2 * i + 1; 
    
  // right = 2*i + 2
    int r = 2 * i + 2; 
  
    // If left child is larger than root
    if (l < n && arr[l] > arr[largest])
        largest = l;
  
    // If right child is larger than largest 
    // so far
    if (r < n && arr[r] > arr[largest])
        largest = r;
  
    // If largest is not root
    if (largest != i) {
        swap(arr[i], arr[largest]);
  
        // Recursively heapify the affected 
        // sub-tree
        heapify(arr, n, largest);
    }
}
  
// Main function to do heap sort
void heapSort(int arr[], int n)
{
    
    // Build heap (rearrange array)
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);
  
    // One by one extract an element 
    // from heap
    for (int i = n - 1; i > 0; i--) {
        
        // Move current root to end
        swap(arr[0], arr[i]);
  
        // call max heapify on the reduced heap
        heapify(arr, i, 0);
    }
}
  
// A utility function to print array of size n 
void printArray(int arr[], int n)
{
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
    cout << "\n";
}
  
// Driver code
int main()
{
    int arr[] = { 12, 11, 13, 5, 6, 7 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    heapSort(arr, n);
  
    cout << "Sorted array is \n";
    printArray(arr, n);
}

C

// Heap Sort in C
  
#include <stdio.h>
  
// Function to swap the position of two elements
  
void swap(int *a, int *b) {
  
  int temp = *a;
  
  *a = *b;
  
  *b = temp;
  
}
  
// To heapify a subtree rooted with node i
// which is an index in arr[]. 
// n is size of heap
void heapify(int arr[], int n, int i) {
  
  // Find largest among root, left child and right child
  
    // Initialize largest as root
  int largest = i;
  
   // left = 2*i + 1
  int left = 2 * i + 1;
  
   // right = 2*i + 2
  int right = 2 * i + 2;
  
  // If left child is larger than root
  if (left < n && arr[left] > arr[largest])
  
    largest = left;
  
  // If right child is larger than largest 
    // so far
  if (right < n && arr[right] > arr[largest])
  
    largest = right;
  
  // Swap and continue heapifying if root is not largest
// If largest is not root
  if (largest != i) {
  
    swap(&arr[i], &arr[largest]);
  
     // Recursively heapify the affected 
     // sub-tree
    heapify(arr, n, largest);
  
  }
  
}
  
// Main function to do heap sort
void heapSort(int arr[], int n) {
  
  // Build max heap
  for (int i = n / 2 - 1; i >= 0; i--)
  
    heapify(arr, n, i);
  
  // Heap sort
  for (int i = n - 1; i >= 0; i--) {
  
    swap(&arr[0], &arr[i]);
  
    // Heapify root element to get highest element at root again
    heapify(arr, i, 0);
  
  }
  
}
  
// A utility function to print array of size n 
void printArray(int arr[], int n)
{
  for (int i = 0; i < n; i++)
    printf("%d ", arr[i]);
  printf("\n");
  
}
  
// Driver code
  
int main() 
{
  int arr[] = {12, 11, 13, 5, 6, 7};
  int n = sizeof(arr) / sizeof(arr[0]);
  heapSort(arr, n);
  printf("Sorted array is given in the following way \n");
  printArray(arr, n);
  
}
  
// This code is contributed by _i_plus_plus_.

Java

// Java program for implementation of Heap Sort
public class HeapSort {
    public void sort(int arr[])
    {
        int n = arr.length;
  
        // Build heap (rearrange array)
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
  
        // One by one extract an element from heap
        for (int i = n - 1; i > 0; i--) {
            // Move current root to end
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
  
            // call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }
  
    // To heapify a subtree rooted with node i which is
    // an index in arr[]. n is size of heap
    void heapify(int arr[], int n, int i)
    {
        int largest = i; // Initialize largest as root
        int l = 2 * i + 1; // left = 2*i + 1
        int r = 2 * i + 2; // right = 2*i + 2
  
        // If left child is larger than root
        if (l < n && arr[l] > arr[largest])
            largest = l;
  
        // If right child is larger than largest so far
        if (r < n && arr[r] > arr[largest])
            largest = r;
  
        // If largest is not root
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
  
            // Recursively heapify the affected sub-tree
            heapify(arr, n, largest);
        }
    }
  
    /* 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 code
    public static void main(String args[])
    {
        int arr[] = { 12, 11, 13, 5, 6, 7 };
        int n = arr.length;
  
        HeapSort ob = new HeapSort();
        ob.sort(arr);
  
        System.out.println("Sorted array is");
        printArray(arr);
    }
}

Python3

# Python program for implementation of heap Sort
  
# To heapify subtree rooted at index i.
# n is size of heap
  
  
def heapify(arr, n, i):
    largest = i  # Initialize largest as root
    l = 2 * i + 1     # left = 2*i + 1
    r = 2 * i + 2     # right = 2*i + 2
  
    # See if left child of root exists and is
    # greater than root
    if l < n and arr[largest] < arr[l]:
        largest = l
  
    # See if right child of root exists and is
    # greater than root
    if r < n and arr[largest] < arr[r]:
        largest = r
  
    # Change root, if needed
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # swap
  
        # Heapify the root.
        heapify(arr, n, largest)
  
# The main function to sort an array of given size
  
  
def heapSort(arr):
    n = len(arr)
  
    # Build a maxheap.
    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)
  
    # One by one extract elements
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # swap
        heapify(arr, i, 0)
  
  
# Driver code
arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
n = len(arr)
print("Sorted array is")
for i in range(n):
    print("%d" % arr[i],end=" ")
# This code is contributed by Mohit Kumra

C#

// C# program for implementation of Heap Sort
using System;
  
public class HeapSort {
    public void sort(int[] arr)
    {
        int n = arr.Length;
  
        // Build heap (rearrange array)
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
  
        // One by one extract an element from heap
        for (int i = n - 1; i > 0; i--) {
            // Move current root to end
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
  
            // call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }
  
    // To heapify a subtree rooted with node i which is
    // an index in arr[]. n is size of heap
    void heapify(int[] arr, int n, int i)
    {
        int largest = i; // Initialize largest as root
        int l = 2 * i + 1; // left = 2*i + 1
        int r = 2 * i + 2; // right = 2*i + 2
  
        // If left child is larger than root
        if (l < n && arr[l] > arr[largest])
            largest = l;
  
        // If right child is larger than largest so far
        if (r < n && arr[r] > arr[largest])
            largest = r;
  
        // If largest is not root
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
  
            // Recursively heapify the affected sub-tree
            heapify(arr, n, largest);
        }
    }
  
    /* 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.Read();
    }
  
    // Driver code
    public static void Main()
    {
        int[] arr = { 12, 11, 13, 5, 6, 7 };
        int n = arr.Length;
  
        HeapSort ob = new HeapSort();
        ob.sort(arr);
  
        Console.WriteLine("Sorted array is");
        printArray(arr);
    }
}
  
// This code is contributed
// by Akanksha Rai(Abby_akku)

PHP

<?php
  
// Php program for implementation of Heap Sort
  
// To heapify a subtree rooted with node i which is
// an index in arr[]. n is size of heap
function heapify(&$arr, $n, $i)
{
    $largest = $i; // Initialize largest as root
    $l = 2*$i + 1; // left = 2*i + 1
    $r = 2*$i + 2; // right = 2*i + 2
  
    // If left child is larger than root
    if ($l < $n && $arr[$l] > $arr[$largest])
        $largest = $l;
  
    // If right child is larger than largest so far
    if ($r < $n && $arr[$r] > $arr[$largest])
        $largest = $r;
  
    // If largest is not root
    if ($largest != $i)
    {
        $swap = $arr[$i];
        $arr[$i] = $arr[$largest];
        $arr[$largest] = $swap;
  
        // Recursively heapify the affected sub-tree
        heapify($arr, $n, $largest);
    }
}
  
// main function to do heap sort
function heapSort(&$arr, $n)
{
    // Build heap (rearrange array)
    for ($i = $n / 2 - 1; $i >= 0; $i--)
        heapify($arr, $n, $i);
  
    // One by one extract an element from heap
    for ($i = $n-1; $i > 0; $i--)
    {
        // Move current root to end
        $temp = $arr[0];
            $arr[0] = $arr[$i];
            $arr[$i] = $temp;
  
        // call max heapify on the reduced heap
        heapify($arr, $i, 0);
    }
}
  
/* A utility function to print array of size n */
function printArray(&$arr, $n)
{
    for ($i = 0; $i < $n; ++$i)
        echo ($arr[$i]." ") ; 
          
} 
  
// Driver program
    $arr = array(12, 11, 13, 5, 6, 7);
    $n = sizeof($arr)/sizeof($arr[0]);
  
    heapSort($arr, $n);
  
    echo 'Sorted array is ' . "\n";
      
    printArray($arr , $n);
  
// This code is contributed by Shivi_Aggarwal
?>

Javascript

<script>
  
// JavaScript program for implementation
// of Heap Sort
  
function sort( arr)
    {
        var n = arr.length;
  
        // Build heap (rearrange array)
        for (var i = Math.floor(n / 2) - 1; i >= 0; i--)
            heapify(arr, n, i);
  
        // One by one extract an element from heap
        for (var i = n - 1; i > 0; i--) {
            // Move current root to end
            var temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
  
            // call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }
  
    // To heapify a subtree rooted with node i which is
    // an index in arr[]. n is size of heap
    function heapify(arr, n, i)
    {
        var largest = i; // Initialize largest as root
        var l = 2 * i + 1; // left = 2*i + 1
        var r = 2 * i + 2; // right = 2*i + 2
  
        // If left child is larger than root
        if (l < n && arr[l] > arr[largest])
            largest = l;
  
        // If right child is larger than largest so far
        if (r < n && arr[r] > arr[largest])
            largest = r;
  
        // If largest is not root
        if (largest != i) {
            var swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
  
            // Recursively heapify the affected sub-tree
            heapify(arr, n, largest);
        }
    }
  
    /* A utility function to print array of size n */
    function printArray(arr)
    {
        var n = arr.length;
        for (var i = 0; i < n; ++i)
            document.write(arr[i] + " ");
          
    }
  
  
    var arr = [ 5, 12, 11, 13, 4, 6, 7 ];
    var n = arr.length;
  
    sort(arr);
  
    document.write( "Sorted array is <br>");
    printArray(arr, n);
  
  
// This code is contributed by SoumikMondal
  
</script>

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 *