merge sort c with examples
Técnica de clasificación por fusión de C ++.
El algoritmo de ordenación por fusión utiliza el ' divide y conquistaras ”Estrategia en la que dividimos el problema en subproblemas y los resolvemos individualmente.
Estos subproblemas luego se combinan o fusionan para formar una solución unificada.
=> Lea la popular serie de capacitación en C ++ aquí.
Lo que vas a aprender:
cuál es el mejor software de desarrollo de aplicaciones
- Visión general
- Algoritmo general
- Pseudocódigo para clasificación por fusión
- Ilustración
- Orden de fusión iterativo
- Análisis de complejidad del algoritmo de clasificación por fusión
- Conclusión
- Lectura recomendada
Visión general
La ordenación por combinación se realiza mediante los siguientes pasos:
#1) La lista que se va a ordenar se divide en dos matrices de igual longitud dividiendo la lista en el elemento del medio. Si el número de elementos de la lista es 0 o 1, la lista se considera ordenada.
#2) Cada sublista se ordena individualmente utilizando la ordenación combinada de forma recursiva.
#3) Las sublistas ordenadas se combinan o fusionan para formar una lista ordenada completa.
Algoritmo general
El pseudocódigo general para la técnica de clasificación por fusión se proporciona a continuación.
Declare una matriz Arr de longitud N
Si N = 1, Arr ya está ordenado
Si N> 1,
Izquierda = 0, derecha = N-1
Encuentra el medio = (izquierda + derecha) / 2
Llamar a merge_sort (Arr, left, middle) => ordenar la primera mitad de forma recursiva
Llamar a merge_sort (Arr, middle + 1, right) => ordenar la segunda mitad de forma recursiva
Llame a merge (Arr, left, middle, right) para fusionar matrices ordenadas en los pasos anteriores.
Salida
Como se muestra en el pseudocódigo anterior, en el algoritmo de clasificación por fusión dividimos la matriz en la mitad y ordenamos cada mitad utilizando la clasificación por fusión de forma recursiva. Una vez que las submatrices se ordenan individualmente, las dos submatrices se fusionan para formar una matriz ordenada completa.
Pseudocódigo para clasificación por fusión
A continuación se muestra el pseudocódigo para la técnica de clasificación por fusión. Primero, tenemos un procedimiento de combinación de ordenación para dividir la matriz en mitades de forma recursiva. Luego tenemos una rutina de combinación que fusionará las matrices más pequeñas ordenadas para obtener una matriz ordenada completa.
|_+_|Ilustremos ahora la técnica de ordenación combinada con un ejemplo.
Ilustración
La ilustración anterior se puede mostrar en forma de tabla a continuación:
Pasar | Lista sin clasificar | divide | Lista ordenada |
---|---|---|---|
1 | {12, 23,2,43,51,35,19,4 } | {12,23,2,43} {51,35,19,4} | {} |
2 | {12,23,2,43} {51,35,19,4} | {12,23}{2,43} {51,35}{19,4} | {} |
3 | {12,23}{2,43} {51,35}{19,4} | {12,23} {2,43} {35,51}{4,19} | {12,23} {2,43} {35,51}{4,19} |
4 | {12,23} {2,43} {35,51}{4,19} | {2,12,23,43} {4,19,35,51} | {2,12,23,43} {4,19,35,51} |
5 | {2,12,23,43} {4,19,35,51} | {2,4,12,19,23,35,43,51} | {2,4,12,19,23,35,43,51} |
6 | {} | {} | {2,4,12,19,23,35,43,51} |
Como se muestra en la representación anterior, primero la matriz se divide en dos submatrices de longitud 4. Cada submatriz se divide en dos submatrices más de longitud 2. Cada submatriz se divide luego en una submatriz de un elemento cada uno. Todo este proceso es el proceso de 'Dividir'.
Una vez que hemos dividido la matriz en submatrices de un solo elemento cada una, ahora tenemos que fusionar estas matrices en orden ordenado.
Como se muestra en la ilustración anterior, consideramos cada submatriz de un solo elemento y primero combinamos los elementos para formar submatrices de dos elementos en orden ordenado. A continuación, los subconjuntos ordenados de longitud dos se ordenan y combinan para formar dos subconjuntos de longitud cuatro cada uno. Luego combinamos estas dos submatrices para formar una matriz ordenada completa.
Orden de fusión iterativo
El algoritmo o técnica de clasificación por fusión que hemos visto anteriormente utiliza la recursividad. También se conoce como ' clasificación de fusión recursiva ”.
Sabemos que las funciones recursivas usan la pila de llamadas de función para almacenar el estado intermedio de la función de llamada. También almacena otra información contable para parámetros, etc. y plantea una sobrecarga en términos de almacenar el registro de activación de la llamada a la función, así como de reanudar la ejecución.
Todos estos gastos generales se pueden eliminar si usamos funciones iterativas en lugar de recursivas. El algoritmo de clasificación de fusión anterior también se puede convertir fácilmente en pasos iterativos mediante ciclos y toma de decisiones.
Al igual que la ordenación de fusión recursiva, la ordenación de fusión iterativa también tiene una complejidad O (nlogn), por lo tanto, en cuanto al rendimiento, funcionan a la par entre sí. Simplemente podemos reducir los gastos generales.
En este tutorial, nos hemos concentrado en la ordenación por fusión recursiva y, a continuación, implementaremos la ordenación por fusión recursiva utilizando los lenguajes C ++ y Java.
A continuación se muestra una implementación de la técnica de ordenación por fusión utilizando C ++.
|_+_|Producción:
Ingrese el número de elementos a ordenar: 10
Introduzca 10 elementos para ordenar: 101 10 2 43 12 54 34 64 89 76
Matriz ordenada
2 10 12 34 43 54 64 76 89 101
En este programa, hemos definido dos funciones, merge_sort y Vamos . En la función merge_sort, dividimos la matriz en dos matrices iguales y llamamos a la función merge en cada una de estas submatrices. En la función de combinación, hacemos la clasificación real en estos subarreglos y luego los combinamos en un arreglo ordenado completo.
A continuación, implementamos la técnica Merge Sort en lenguaje Java.
|_+_|Producción:
Matriz de entrada
101 10 2 43 12 54 34 64 89 76
Matriz ordenada mediante ordenación combinada
2 10 12 34 43 54 64 76 89 101
También en la implementación de Java, usamos la misma lógica que usamos en la implementación de C ++.
La ordenación por combinación es una forma eficaz de ordenar listas y se utiliza principalmente para ordenar listas vinculadas. Dado que utiliza un enfoque de dividir y conquistar, la técnica de ordenación por fusión funciona con la misma eficacia tanto para matrices pequeñas como grandes.
Análisis de complejidad del algoritmo de clasificación por fusión
Sabemos que para realizar la clasificación utilizando la clasificación por combinación, primero dividimos la matriz en dos mitades iguales. Esto está representado por “log n” que es una función logarítmica y el número de pasos dados es log (n + 1) como máximo.
A continuación, para encontrar el elemento medio de la matriz, necesitamos un solo paso, es decir, O (1).
Luego, para fusionar las submatrices en una matriz de n elementos, tomaremos O (n) cantidad de tiempo de ejecución.
Por lo tanto, el tiempo total para realizar la clasificación por fusión será n (log n + 1), lo que nos da la complejidad de tiempo de O (n * logn).
Complejidad en el peor de los casos | O (n * log n) |
Mejor complejidad en el tiempo del caso | O (n * log n) |
Complejidad de tiempo promedio | O (n * log n) |
Complejidad espacial | En) |
La complejidad del tiempo para la ordenación por fusión es la misma en los tres casos (peor, mejor y promedio) ya que siempre divide la matriz en submatrices y luego fusiona las submatrices tomando un tiempo lineal.
La ordenación por fusión siempre ocupa la misma cantidad de espacio que las matrices no ordenadas. Por lo tanto, cuando la lista que se va a ordenar es una matriz, la ordenación por combinación no debe usarse para matrices muy grandes. Sin embargo, la ordenación por combinación se puede utilizar de manera más eficaz para la ordenación de listas vinculadas.
Conclusión
La ordenación por fusión utiliza la estrategia de 'dividir y conquistar' que divide la matriz o lista en numerosas submatrices y las ordena individualmente y luego se fusiona en una matriz ordenada completa.
La clasificación por combinación funciona más rápido que otros métodos de clasificación y también funciona de manera eficiente para matrices más pequeñas y más grandes.
¡Exploraremos más sobre Clasificación rápida en nuestro próximo tutorial!
=> Tenga cuidado con la guía de formación para principiantes de C ++ aquí.
Lectura recomendada
- Método MongoDB Sort () con ejemplos
- Comando de ordenación de Unix con sintaxis, opciones y ejemplos
- Orden de Shell en C ++ con ejemplos
- Ordenar montón en C ++ con ejemplos
- Orden de selección en C ++ con ejemplos
- Clasificación de burbujas en C ++ con ejemplos
- Orden de inserción en C ++ con ejemplos
- Clasificación rápida en C ++ con ejemplos