Clasificación de combinación iterativa – Part 1

A continuación se muestra una implementación recursiva típica de Merge Sort 

C++

// Recursive C++ program for merge sort 
#include<bits/stdc++.h>
using namespace std;
  
// Function to merge the two haves
// arr[l..m] and arr[m+1..r] of array arr[] 
void merge(int arr[], int l, int m, int r);
  
// l is for left index and r is
// right index of the sub-array
// of arr to be sorted 
void mergeSort(int arr[], int l, int r)
{
    if (l < r)
    {
          
        // Same as (l+r)/2 but avoids
        // overflow for large l & h
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}
  
// Function to merge the two haves arr[l..m]
// and arr[m+1..r] of array arr[] 
void merge(int arr[], int l, int m, int r)
{
    int k;
    int n1 = m - l + 1;
    int n2 =  r - m;
  
    // Create temp arrays 
    int L[n1], R[n2];
  
    // Copy data to temp arrays L[] and R[]
    for(int i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for(int j = 0; j < n2; j++)
        R[j] = arr[m + 1+ j];
  
    // Merge the temp arrays
    // back into arr[l..r]
    int i = 0;
    int j = 0;
    k = l;
      
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
  
    // Copy the remaining elements
    // of L[], if there are any 
    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }
  
    // Copy the remaining elements
    // of R[], if there are any 
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}
  
// Function to print an array 
void printArray(int A[], int size)
{
    for(int i = 0; i < size; i++)
        printf("%d ", A[i]);
          
    cout << "\n";
}
  
// Driver code
int main()
{
    int arr[] = { 12, 11, 13, 5, 6, 7 };
    int arr_size = sizeof(arr) / sizeof(arr[0]);
  
    cout << "Given array is \n";
    printArray(arr, arr_size);
  
    mergeSort(arr, 0, arr_size - 1);
  
    cout << "\nSorted array is \n";
    printArray(arr, arr_size);
    return 0;
}
  
// This code is contributed by Mayank Tyagi

C

/* Recursive C program for merge sort */
#include<stdlib.h>
#include<stdio.h>
  
/* Function to merge the two haves
 arr[l..m] and arr[m+1..r] of array arr[] */
void merge(int arr[], int l, int m, int r);
  
/* l is for left index and r is
 right index of the sub-array
  of arr to be sorted */
void mergeSort(int arr[], int l, int r)
{
   if (l < r)
   {
      // Same as (l+r)/2 but avoids
      // overflow for large l & h
      int m = l+(r-l)/2; 
      mergeSort(arr, l, m);
      mergeSort(arr, m+1, r);
      merge(arr, l, m, r);
   }
}
  
/* Function to merge the two haves arr[l..m]
 and arr[m+1..r] of array arr[] */
void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 =  r - m;
  
    /* create temp arrays */
    int L[n1], R[n2];
  
    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1+ j];
  
    /* Merge the temp arrays back into arr[l..r]*/
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
  
    /* Copy the remaining elements
    of L[], if there are any */
    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }
  
    /* Copy the remaining elements
    of R[], if there are any */
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}
  
/* Function to print an array */
void printArray(int A[], int size)
{
    int i;
    for (i=0; i < size; i++)
        printf("%d ", A[i]);
    printf("\n");
}
  
/* Driver program to test above functions */
int main()
{
    int arr[] = {12, 11, 13, 5, 6, 7};
    int arr_size = sizeof(arr)/sizeof(arr[0]);
  
    printf("Given array is \n");
    printArray(arr, arr_size);
  
    mergeSort(arr, 0, arr_size - 1);
  
    printf("\nSorted array is \n");
    printArray(arr, arr_size);
    return 0;
}

Java

// Recursive Java Program for merge sort
  
import java.util.Arrays;
public class GFG
{
    public static void mergeSort(int[] array)
    {
        if(array == null)
        {
            return;
        }
  
        if(array.length > 1)
        {
            int mid = array.length / 2;
  
            // Split left part
            int[] left = new int[mid];
            for(int i = 0; i < mid; i++)
            {
                left[i] = array[i];
            }
              
            // Split right part
            int[] right = new int[array.length - mid];
            for(int i = mid; i < array.length; i++)
            {
                right[i - mid] = array[i];
            }
            mergeSort(left);
            mergeSort(right);
  
            int i = 0;
            int j = 0;
            int k = 0;
  
            // Merge left and right arrays
            while(i < left.length && j < right.length)
            {
                if(left[i] < right[j])
                {
                    array[k] = left[i];
                    i++;
                }
                else
                {
                    array[k] = right[j];
                    j++;
                }
                k++;
            }
            // Collect remaining elements
            while(i < left.length)
            {
                array[k] = left[i];
                i++;
                k++;
            }
            while(j < right.length)
            {
                array[k] = right[j];
                j++;
                k++;
            }
        }
    }
  
    // Driver program to test above functions.
    public static void main(String[] args)
    {
        int arr[] = {12, 11, 13, 5, 6, 7};
        int i=0;
        System.out.println("Given array is");
  
        for(i=0; i<arr.length; i++)
            System.out.print(arr[i]+" ");
  
        mergeSort(arr);
  
        System.out.println("\n");
        System.out.println("Sorted array is");
  
        for(i=0; i<arr.length; i++)
            System.out.print(arr[i]+" ");
    }
}
  
// Code Contributed by Mohit Gupta_OMG

Python3

# Recursive Python Program for merge sort
  
def merge(left, right):
    if not len(left) or not len(right):
        return left or right
  
    result = []
    i, j = 0, 0
    while (len(result) < len(left) + len(right)):
        if left[i] < right[j]:
            result.append(left[i])
            i+= 1
        else:
            result.append(right[j])
            j+= 1
        if i == len(left) or j == len(right):
            result.extend(left[i:] or right[j:])
            break 
  
    return result
  
def mergesort(list):
    if len(list) < 2:
        return list
  
    middle = int(len(list)/2)
    left = mergesort(list[:middle])
    right = mergesort(list[middle:])
  
    return merge(left, right)
      
seq = [12, 11, 13, 5, 6, 7]
print("Given array is")
print(seq); 
print("\n")
print("Sorted array is")
print(mergesort(seq))
  
# Code Contributed by Mohit Gupta_OMG 

C#

/* Iterative C# program for merge
sort */
using System;
  
class GFG {
   
    /* l is for left index and r
    is right index of the sub-array 
    of arr to be sorted */
    static void mergeSort(int[] arr,
                           int l, int r)
    {
        if (l < r)
        {
             
            // Same as (l+r)/2 but avoids 
            // overflow for large l & h
            int m = l + (r - l) / 2; 
            mergeSort(arr, l, m);
            mergeSort(arr, m+1, r);
            merge(arr, l, m, r);
       }
    }
  
    /* Function to merge the two haves
    arr[l..m] and arr[m+1..r] of array 
    arr[] */
    static void merge(int[] arr, int l,
                           int m, int r)
    {
        int i, j, k;
        int n1 = m - l + 1;
        int n2 = r - m;
      
        /* create temp arrays */
        int []L = new int[n1];
        int []R = new int[n2];
      
        /* Copy data to temp arrays
        L[] and R[] */
        for (i = 0; i < n1; i++)
            L[i] = arr[l + i];
        for (j = 0; j < n2; j++)
            R[j] = arr[m + 1+ j];
      
        /* Merge the temp arrays back 
        into arr[l..r]*/
        i = 0;
        j = 0;
        k = l;
        while (i < n1 && j < n2)
        {
            if (L[i] <= R[j])
            {
                arr[k] = L[i];
                i++;
            }
            else
            {
                arr[k] = R[j];
                j++;
            }
            k++;
        }
      
        /* Copy the remaining elements of
        L[], if there are any */
        while (i < n1)
        {
            arr[k] = L[i];
            i++;
            k++;
        }
      
        /* Copy the remaining elements of
        R[], if there are any */
        while (j < n2)
        {
            arr[k] = R[j];
            j++;
            k++;
        }
    }
      
    /* Function to print an array */
    static void printArray(int []A, int size)
    {
        int i;
        for (i=0; i < size; i++)
            Console.Write(A[i]+" ");
        Console.Write("\n");
    }
      
    /* Driver program to test above functions */
    public static void Main()
    {
        int []arr = {12, 11, 13, 5, 6, 7};
        int arr_size = arr.Length;
      
        Console.Write("Given array is \n");
        printArray(arr, arr_size);
      
        mergeSort(arr, 0, arr_size - 1);
      
        Console.Write("\nSorted array is \n");
        printArray(arr, arr_size);
    }
}
  
// This code is contributed by Smitha

Javascript

<script>
  
// Recursive javascript Program for merge sort
  
    function mergeSort(array) {
        if (array == null) {
            return;
        }
  
        if (array.length > 1) {
            var mid = parseInt(array.length / 2);
  
            // Split left part
            var left = Array(mid).fill(0);
            for (i = 0; i < mid; i++) {
                left[i] = array[i];
            }
  
            // Split right part
            var right = Array(array.length - mid).fill(0);
            for (i = mid; i < array.length; i++) {
                right[i - mid] = array[i];
            }
            mergeSort(left);
            mergeSort(right);
  
            var i = 0;
            var j = 0;
            var k = 0;
  
            // Merge left and right arrays
            while (i < left.length && j < right.length) {
                if (left[i] < right[j]) {
                    array[k] = left[i];
                    i++;
                } else {
                    array[k] = right[j];
                    j++;
                }
                k++;
            }
            // Collect remaining elements
            while (i < left.length) {
                array[k] = left[i];
                i++;
                k++;
            }
            while (j < right.length) {
                array[k] = right[j];
                j++;
                k++;
            }
        }
    }
  
    // Driver program to test above functions.
      
        var arr = [ 12, 11, 13, 5, 6, 7 ];
        var i = 0;
        document.write("Given array is<br/>");
  
        for (i = 0; i < arr.length; i++)
            document.write(arr[i] + " ");
  
        mergeSort(arr);
  
        document.write("<br/><br/>");
        document.write("Sorted array is<br/>");
  
        for (i = 0; i < arr.length; i++)
            document.write(arr[i] + " ");
  
// This code is contributed by umadevi9616 
  
</script>

Producción:  

Given array is
12 11 13 5 6 7

Sorted array is
5 6 7 11 12 13

Clasificación de combinación iterativa: 
la función anterior es recursiva, por lo que utiliza la pila de llamadas de función para almacenar valores intermedios de l y h. La pila de llamadas de función almacena otra información de contabilidad junto con parámetros. Además, las llamadas a funciones implican gastos generales como almacenar el registro de activación de la función que llama y luego reanudar la ejecución. A diferencia de Iterative QuickSort , iterative MergeSort no requiere una pila auxiliar explícita. 

Nota: En la ordenación de combinación iterativa, hacemos un enfoque de abajo hacia arriba, es decir, comenzamos desde una array del tamaño de 2 elementos (sabemos que la array del tamaño de 1 elemento ya está ordenada). Además, el punto clave es que, dado que no sabemos cómo dividir la array exactamente como en el enfoque de arriba hacia abajo, donde la array de tamaño de 2 elementos puede tener una secuencia de tamaño 2,1,2,2,1… nosotros en el enfoque de abajo hacia arriba suponga que la array se dividió exactamente por potencias de 2 (n/2,n/4… etc.) para un tamaño de array de potencias de 2, por ejemplo: n=2,4,8,16. 
Entonces, para otros tamaños de entrada como 5, 7, 11, tendremos una sublista restante que no entró en la potencia de 2 anchos en cada nivel a medida que continuamos fusionándonos y subiendo, esta sublista no fusionada que es de tamaño que no es potencia exacta de 2, permanecerá aislado hasta la fusión final. 
Para fusionar esta lista no fusionada en la fusión final, debemos forzar que el medio esté al comienzo de la lista no fusionada para que sea un candidato para la fusión. 

El recuento de elementos de la sublista no fusionados que se aislará hasta la llamada de fusión final se puede averiguar utilizando el resto (n % de ancho). La fusión final (cuando tenemos listas desiguales) se puede identificar por (ancho>n/2).

Dado que el ancho crece en potencias de 2 cuando el ancho == n/2, significa que la entrada ya tenía un tamaño en potencias de 2, de lo contrario, si el ancho < n/2, aún no hemos llegado a la fusión final, entonces cuando el ancho > n /2 debemos tener una lista desigual no fusionada pendiente, por lo tanto, reiniciamos mid solo en tal caso.

Complete Interview Preparation - GFG

La función anterior se puede convertir fácilmente a una versión iterativa. A continuación se muestra una ordenación de combinación iterativa.  

C++

/* Iterative C program for merge sort */
#include <bits/stdc++.h>
using namespace std;
  
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
void merge(int arr[], int l, int m, int r);
  
// Utility function to find minimum of two integers
int min(int x, int y) { return (x<y)? x :y; }
  
  
/* Iterative mergesort function to sort arr[0...n-1] */
void mergeSort(int arr[], int n)
{
   int curr_size;  // For current size of subarrays to be merged
                   // curr_size varies from 1 to n/2
   int left_start; // For picking starting index of left subarray
                   // to be merged
  
   // Merge subarrays in bottom up manner.  First merge subarrays of
   // size 1 to create sorted subarrays of size 2, then merge subarrays
   // of size 2 to create sorted subarrays of size 4, and so on.
   for (curr_size=1; curr_size<=n-1; curr_size = 2*curr_size)
   {
       // Pick starting point of different subarrays of current size
       for (left_start=0; left_start<n-1; left_start += 2*curr_size)
       {
           // Find ending point of left subarray. mid+1 is starting 
           // point of right
           int mid = min(left_start + curr_size - 1, n-1);
  
           int right_end = min(left_start + 2*curr_size - 1, n-1);
  
           // Merge Subarrays arr[left_start...mid] & arr[mid+1...right_end]
           merge(arr, left_start, mid, right_end);
       }
   }
}
  
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 =  r - m;
  
    /* create temp arrays */
    int L[n1], R[n2];
  
    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1+ j];
  
    /* Merge the temp arrays back into arr[l..r]*/
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
  
    /* Copy the remaining elements of L[], if there are any */
    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }
  
    /* Copy the remaining elements of R[], if there are any */
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}
  
/* Function to print an array */
void printArray(int A[], int size)
{
    int i;
    for (i=0; i < size; i++)
        cout <<" "<< A[i];
    cout <<"\n";
}
  
/* Driver program to test above functions */
int main()
{
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr)/sizeof(arr[0]);
  
    cout <<"Given array is \n ";
    printArray(arr, n);
  
    mergeSort(arr, n);
  
    cout <<"\nSorted array is \n ";
    printArray(arr, n);
    return 0;
}
// This code is contributed shivanisinghss2110

C

/* Iterative C program for merge sort */
#include<stdlib.h>
#include<stdio.h>
  
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
void merge(int arr[], int l, int m, int r);
  
// Utility function to find minimum of two integers
int min(int x, int y) { return (x<y)? x :y; }
  
  
/* Iterative mergesort function to sort arr[0...n-1] */
void mergeSort(int arr[], int n)
{
   int curr_size;  // For current size of subarrays to be merged
                   // curr_size varies from 1 to n/2
   int left_start; // For picking starting index of left subarray
                   // to be merged
  
   // Merge subarrays in bottom up manner.  First merge subarrays of
   // size 1 to create sorted subarrays of size 2, then merge subarrays
   // of size 2 to create sorted subarrays of size 4, and so on.
   for (curr_size=1; curr_size<=n-1; curr_size = 2*curr_size)
   {
       // Pick starting point of different subarrays of current size
       for (left_start=0; left_start<n-1; left_start += 2*curr_size)
       {
           // Find ending point of left subarray. mid+1 is starting 
           // point of right
           int mid = min(left_start + curr_size - 1, n-1);
  
           int right_end = min(left_start + 2*curr_size - 1, n-1);
  
           // Merge Subarrays arr[left_start...mid] & arr[mid+1...right_end]
           merge(arr, left_start, mid, right_end);
       }
   }
}
  
/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */
void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 =  r - m;
  
    /* create temp arrays */
    int L[n1], R[n2];
  
    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1+ j];
  
    /* Merge the temp arrays back into arr[l..r]*/
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
  
    /* Copy the remaining elements of L[], if there are any */
    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }
  
    /* Copy the remaining elements of R[], if there are any */
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}
  
/* Function to print an array */
void printArray(int A[], int size)
{
    int i;
    for (i=0; i < size; i++)
        printf("%d ", A[i]);
    printf("\n");
}
  
/* Driver program to test above functions */
int main()
{
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr)/sizeof(arr[0]);
  
    printf("Given array is \n");
    printArray(arr, n);
  
    mergeSort(arr, n);
  
    printf("\nSorted array is \n");
    printArray(arr, n);
    return 0;
}

Java

/* Iterative Java program for merge sort */
import java.lang.Math.*;
  
class GFG {
  
    /* Iterative mergesort function to sor
    t arr[0...n-1] */
    static void mergeSort(int arr[], int n)
    {
          
        // For current size of subarrays to
        // be merged curr_size varies from 
        // 1 to n/2
        int curr_size; 
                      
        // For picking starting index of 
        // left subarray to be merged
        int left_start;
                          
          
        // Merge subarrays in bottom up 
        // manner. First merge subarrays 
        // of size 1 to create sorted 
        // subarrays of size 2, then merge
        // subarrays of size 2 to create 
        // sorted subarrays of size 4, and
        // so on.
        for (curr_size = 1; curr_size <= n-1; 
                      curr_size = 2*curr_size)
        {
              
            // Pick starting point of different
            // subarrays of current size
            for (left_start = 0; left_start < n-1;
                        left_start += 2*curr_size)
            {
                // Find ending point of left 
                // subarray. mid+1 is starting 
                // point of right
                int mid = Math.min(left_start + curr_size - 1, n-1);
          
                int right_end = Math.min(left_start 
                             + 2*curr_size - 1, n-1);
          
                // Merge Subarrays arr[left_start...mid]
                // & arr[mid+1...right_end]
                merge(arr, left_start, mid, right_end);
            }
        }
    }
      
    /* Function to merge the two haves arr[l..m] and
    arr[m+1..r] of array arr[] */
    static void merge(int arr[], int l, int m, int r)
    {
        int i, j, k;
        int n1 = m - l + 1;
        int n2 = r - m;
      
        /* create temp arrays */
        int L[] = new int[n1];
        int R[] = new int[n2];
      
        /* Copy data to temp arrays L[]
        and R[] */
        for (i = 0; i < n1; i++)
            L[i] = arr[l + i];
        for (j = 0; j < n2; j++)
            R[j] = arr[m + 1+ j];
      
        /* Merge the temp arrays back into
        arr[l..r]*/
        i = 0;
        j = 0;
        k = l;
        while (i < n1 && j < n2)
        {
            if (L[i] <= R[j])
            {
                arr[k] = L[i];
                i++;
            }
            else
            {
                arr[k] = R[j];
                j++;
            }
            k++;
        }
      
        /* Copy the remaining elements of 
        L[], if there are any */
        while (i < n1)
        {
            arr[k] = L[i];
            i++;
            k++;
        }
      
        /* Copy the remaining elements of
        R[], if there are any */
        while (j < n2)
        {
            arr[k] = R[j];
            j++;
            k++;
        }
    }
      
    /* Function to print an array */
    static void printArray(int A[], int size)
    {
        int i;
        for (i=0; i < size; i++)
            System.out.printf("%d ", A[i]);
        System.out.printf("\n");
    }
      
    /* Driver program to test above functions */
    public static void main(String[] args)
    {
        int arr[] = {12, 11, 13, 5, 6, 7};
        int n = arr.length;
      
        System.out.printf("Given array is \n");
        printArray(arr, n);
      
        mergeSort(arr, n);
      
        System.out.printf("\nSorted array is \n");
        printArray(arr, n);
    }
}
  
// This code is contributed by Smitha

Python3

# Iterative Merge sort (Bottom Up) 
  
# Iterative mergesort function to 
# sort arr[0...n-1] 
  
# perform bottom up merge
def mergeSort(a):
    # start with least partition size of 2^0 = 1
    width = 1    
    n = len(a)                                          
    # subarray size grows by powers of 2 
    # since growth of loop condition is exponential, 
    # time consumed is logarithmic (log2n)
    while (width < n):
        # always start from leftmost
        l=0;
        while (l < n): 
            r = min(l+(width*2-1), n-1)         
            m = min(l+width-1,n-1)
            # final merge should consider 
            # unmerged sublist if input arr
            # size is not power of 2              
            merge(a, l, m, r)
            l += width*2
        # Increasing sub array size by powers of 2
        width *= 2
    return a
    
# Merge Function 
def merge(a, l, m, r): 
    n1 = m - l + 1
    n2 = r - m 
    L = [0] * n1 
    R = [0] * n2 
    for i in range(0, n1): 
        L[i] = a[l + i] 
    for i in range(0, n2): 
        R[i] = a[m + i + 1] 
  
    i, j, k = 0, 0, l 
    while i < n1 and j < n2: 
        if L[i] <= R[j]: 
            a[k] = L[i] 
            i += 1
        else: 
            a[k] = R[j] 
            j += 1
        k += 1
  
    while i < n1: 
        a[k] = L[i] 
        i += 1
        k += 1
  
    while j < n2: 
        a[k] = R[j] 
        j += 1
        k += 1
  
  
# Driver code 
a = [-74,48,-20,2,10,-84,-5,-9,11,-24,-91,2,-71,64,63,80,28,-30,-58,-11,-44,-87,-22,54,-74,-10,-55,-28,-46,29,10,50,-72,34,26,25,8,51,13,30,35,-8,50,65,-6,16,-2,21,-78,35,-13,14,23,-3,26,-90,86,25,-56,91,-13,92,-25,37,57,-20,-69,98,95,45,47,29,86,-28,73,-44,-46,65,-84,-96,-24,-12,72,-68,93,57,92,52,-45,-2,85,-63,56,55,12,-85,77,-39]
print("Given array is ") 
print(a) 
mergeSort(a) 
  
print("Sorted array is ") 
print(a) 
  
# Contributed by Madhur Chhangani [RCOEM] 
# corrected and improved by @mahee96

C#

/* Iterative C# program for merge sort */
using System;
public class GFG {
   
    /* Iterative mergesort function to sor
    t arr[0...n-1] */
    static void mergeSort(int []arr, int n)
    {
           
        // For current size of subarrays to
        // be merged curr_size varies from 
        // 1 to n/2
        int curr_size; 
                       
        // For picking starting index of 
        // left subarray to be merged
        int left_start;
                           
           
        // Merge subarrays in bottom up 
        // manner. First merge subarrays 
        // of size 1 to create sorted 
        // subarrays of size 2, then merge
        // subarrays of size 2 to create 
        // sorted subarrays of size 4, and
        // so on.
        for (curr_size = 1; curr_size <= n-1; 
                      curr_size = 2*curr_size)
        {
               
            // Pick starting point of different
            // subarrays of current size
            for (left_start = 0; left_start < n-1;
                        left_start += 2*curr_size)
            {
                // Find ending point of left 
                // subarray. mid+1 is starting 
                // point of right
                int mid = Math.Min(left_start + curr_size - 1,n-1);
           
                int right_end = Math.Min(left_start 
                             + 2*curr_size - 1, n-1);
           
                // Merge Subarrays arr[left_start...mid]
                // & arr[mid+1...right_end]
                merge(arr, left_start, mid, right_end);
            }
        }
    }
       
    /* Function to merge the two haves arr[l..m] and
    arr[m+1..r] of array arr[] */
    static void merge(int []arr, int l, int m, int r)
    {
        int i, j, k;
        int n1 = m - l + 1;
        int n2 = r - m;
       
        /* create temp arrays */
        int []L = new int[n1];
        int []R = new int[n2];
       
        /* Copy data to temp arrays L[]
        and R[] */
        for (i = 0; i < n1; i++)
            L[i] = arr[l + i];
        for (j = 0; j < n2; j++)
            R[j] = arr[m + 1+ j];
       
        /* Merge the temp arrays back into
        arr[l..r]*/
        i = 0;
        j = 0;
        k = l;
        while (i < n1 && j < n2)
        {
            if (L[i] <= R[j])
            {
                arr[k] = L[i];
                i++;
            }
            else
            {
                arr[k] = R[j];
                j++;
            }
            k++;
        }
       
        /* Copy the remaining elements of 
        L[], if there are any */
        while (i < n1)
        {
            arr[k] = L[i];
            i++;
            k++;
        }
       
        /* Copy the remaining elements of
        R[], if there are any */
        while (j < n2)
        {
            arr[k] = R[j];
            j++;
            k++;
        }
    }
       
    /* Function to print an array */
    static void printArray(int []A, int size)
    {
        int i;
        for (i=0; i < size; i++)
            Console.Write(A[i]+" ");
        Console.WriteLine("");
    }
       
    /* Driver program to test above functions */
    public static void Main()
    {
        int []arr = {-74,48,-20,2,10,-84,-5,-9,11,-24,-91,2,-71,64,63,80,28,-30,-58,-11,-44,-87,-22,54,-74,-10,-55,-28,-46,29,10,50,-72,34,26,25,8,51,13,30,35,-8,50,65,-6,16,-2,21,-78,35,-13,14,23,-3,26,-90,86,25,-56,91,-13,92,-25,37,57,-20,-69,98,95,45,47,29,86,-28,73,-44,-46,65,-84,-96,-24,-12,72,-68,93,57,92,52,-45,-2,85,-63,56,55,12,-85,77,-39};
        int n = arr.Length;
       
        Console.Write("Given array is \n");
        printArray(arr, n);
       
        mergeSort(arr, n);
       
        Console.Write("\nSorted array is \n");
        printArray(arr, n);
    }
}
// This code is contributed by Rajput-Ji

Javascript

<script>
/* Iterative javascript program for merge sort */
  
    /*
     * Iterative mergesort function to sor t arr[0...n-1]
     */
    function mergeSort(arr , n) {
  
        // For current size of subarrays to
        // be merged curr_size varies from
        // 1 to n/2
        var curr_size;
  
        // For picking starting index of
        // left subarray to be merged
        var left_start;
  
        // Merge subarrays in bottom up
        // manner. First merge subarrays
        // of size 1 to create sorted
        // subarrays of size 2, then merge
        // subarrays of size 2 to create
        // sorted subarrays of size 4, and
        // so on.
        for (curr_size = 1; curr_size <= n - 1; curr_size = 2 * curr_size) {
  
            // Pick starting point of different
            // subarrays of current size
            for (left_start = 0; left_start < n - 1; left_start += 2 * curr_size) {
                // Find ending point of left
                // subarray. mid+1 is starting
                // point of right
                var mid = Math.min(left_start + curr_size - 1, n - 1);
  
                var right_end = Math.min(left_start + 2 * curr_size - 1, n - 1);
  
                // Merge Subarrays arr[left_start...mid]
                // & arr[mid+1...right_end]
                merge(arr, left_start, mid, right_end);
            }
        }
    }
  
    /*
     * Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr
     */
    function merge(arr , l , m , r) {
        var i, j, k;
        var n1 = m - l + 1;
        var n2 = r - m;
  
        /* create temp arrays */
        var L = Array(n1).fill(0);
        var R = Array(n2).fill(0);
  
        /*
         * Copy data to temp arrays L and R
         */
        for (i = 0; i < n1; i++)
            L[i] = arr[l + i];
        for (j = 0; j < n2; j++)
            R[j] = arr[m + 1 + j];
  
        /*
         * Merge the temp arrays back into arr[l..r]
         */
        i = 0;
        j = 0;
        k = l;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = R[j];
                j++;
            }
            k++;
        }
  
        /*
         * Copy the remaining elements of L, if there are any
         */
        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }
  
        /*
         * Copy the remaining elements of R, if there are any
         */
        while (j < n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }
  
    /* Function to print an array */
    function printArray(A , size) {
        var i;
        for (i = 0; i < size; i++)
            document.write( A[i]+" ");
        document.write("<br/>");
    }
  
    /* Driver program to test above functions */
      
        var arr = [-74,48,-20,2,10,-84,-5,-9,11,-24,-91,2,-71,64,63,80,28,-30,-58,-11,-44,-87,-22,54,-74,-10,-55,-28,-46,29,10,50,-72,34,26,25,8,51,13,30,35,-8,50,65,-6,16,-2,21,-78,35,-13,14,23,-3,26,-90,86,25,-56,91,-13,92,-25,37,57,-20,-69,98,95,45,47,29,86,-28,73,-44,-46,65,-84,-96,-24,-12,72,-68,93,57,92,52,-45,-2,85,-63,56,55,12,-85,77,-39];
        var n = arr.length;
  
        document.write("Given array is <br/>");
        printArray(arr, n);
  
        mergeSort(arr, n);
  
        document.write("<br/>Sorted array is <br/>");
        printArray(arr, n);
  
// This code contributed by umadevi9616 
</script>

Producción: 

Given array is
12 11 13 5 6 7

Sorted array is
5 6 7 11 12 13

La complejidad temporal de la función iterativa anterior es la misma que la recursiva, es decir, Θ(nLogn). 

Echa un vistazo al curso de autoaprendizaje de DSA

Referencias:  
http://csg.sph.umich.edu/abecasis/class/2006/615.09.pdf
Este artículo es una contribución de Shivam Agrawal . 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 *