Skip to content
ExamplesEspañolWorkspace →

Merge Sort

Splits the array in halves, sorts each one recursively and merges them.

Level
Advanced
Concepts:
Input & output
Arrays
SubProcesos
Recursion
Mientras
Para
Si
Randomness
Open in Codoritmo

Run, change and debug this example in your browser.

What you'll learn

OrdenarPorMezcla calls itself on each half until the pieces have one element, and Mezclar joins two sorted pieces by always taking the smaller of the two fronts. The array is halved about log n times and each level merges n elements: always O(n log n), at the price of a temporary array of size n. Arrays are passed by reference, so every subprocess works on the same array.

Code

merge-sort.psc · 74 lines
// Muestra el arreglo completo solo si es corto (30 o menos)SubProceso MostrarDatos(titulo, datos, n)    Definir i Como Entero    Si n <= 30 Entonces        Escribir Sin Saltar titulo        Para i <- 1 Hasta n Hacer            Escribir Sin Saltar datos[i], " "        FinPara        Escribir ""    SiNo        Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")"    FinSiFinSubProceso// Une dos tramos ya ordenados: datos[izquierda..medio] y datos[medio+1..derecha]SubProceso Mezclar(datos, temporal, izquierda, medio, derecha)    Definir i, j, k Como Entero    i <- izquierda    j <- medio + 1    k <- izquierda    // Tomamos siempre el menor de los dos frentes    Mientras i <= medio Y j <= derecha Hacer        // Con <= los iguales conservan su orden: por eso es estable        Si datos[i] <= datos[j] Entonces            temporal[k] <- datos[i]            i <- i + 1        SiNo            temporal[k] <- datos[j]            j <- j + 1        FinSi        k <- k + 1    FinMientras    // Copiamos lo que haya sobrado de cualquiera de las dos mitades    Mientras i <= medio Hacer        temporal[k] <- datos[i]        i <- i + 1        k <- k + 1    FinMientras    Mientras j <= derecha Hacer        temporal[k] <- datos[j]        j <- j + 1        k <- k + 1    FinMientras    // Devolvemos el tramo mezclado al arreglo original    Para k <- izquierda Hasta derecha Hacer        datos[k] <- temporal[k]    FinParaFinSubProceso// Los arreglos se pasan por referencia: el subproceso ordena el arreglo del algoritmoSubProceso OrdenarPorMezcla(datos, temporal, izquierda, derecha)    Definir medio Como Entero    // Un tramo de un solo elemento ya está ordenado: ahí termina la recursión    Si izquierda < derecha Entonces        medio <- Trunc((izquierda + derecha) / 2)        OrdenarPorMezcla(datos, temporal, izquierda, medio)        OrdenarPorMezcla(datos, temporal, medio + 1, derecha)        Mezclar(datos, temporal, izquierda, medio, derecha)    FinSiFinSubProcesoAlgoritmo OrdenamientoMezcla    Definir datos, temporal, n, i Como Entero    Escribir "¿Cuántos números quieres ordenar? (1 a 512)"    Leer n    // temporal es la memoria extra que necesita la mezcla    Dimension datos[n], temporal[n]    Para i <- 1 Hasta n Hacer        datos[i] <- Aleatorio(1, 99)    FinPara    MostrarDatos("Antes:   ", datos, n)    OrdenarPorMezcla(datos, temporal, 1, n)    MostrarDatos("Después: ", datos, n)FinAlgoritmo

Flowchart

Each block in the flowchart matches one instruction in the code.

Algoritmo OrdenamientoMezcla
Algoritmo OrdenamientoMezclaAlgoritmo OrdenamientoMezclaAlgoritmo OrdenamientoMezclaDefinir datos, temporal, n, i Como EnteroDefinir datos, temporal, n, iComo EnteroEscribir "¿Cuántos números quieres ordenar? (1 a 512)"Escribir "¿Cuántos númerosquieres ordenar? (1 a 512)"Leer nLeer nDimension datos[n], temporal[n]Dimension datos[n],temporal[n]Para i <- 1 Hasta n HacerPara i <- 1 Hasta ndatos[i] <- Aleatorio(1, 99)datos[i] <- Aleatorio(1, 99)MostrarDatos("Antes: ", datos, n)MostrarDatos("Antes: ",datos, n)OrdenarPorMezcla(datos, temporal, 1, n)OrdenarPorMezcla(datos,temporal, 1, n)MostrarDatos("Después: ", datos, n)MostrarDatos("Después: ",datos, n)FinAlgoritmoFinAlgoritmo
SubProceso MostrarDatos
SubProceso MostrarDatosSíNoSubProceso MostrarDatos(titulo, datos, n)SubProceso MostrarDatos(titulo,datos, n)Definir i Como EnteroDefinir i Como EnteroSi n <= 30 Entoncesn <= 30Escribir Sin Saltar tituloEscribir Sin Saltar tituloPara i <- 1 Hasta n HacerPara i <- 1 Hasta nEscribir Sin Saltar datos[i], " "Escribir Sin Saltar datos[i]," "Escribir ""Escribir ""Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")"Escribir titulo, n, " números(el primero es ", datos[1], "y el último ", datos[n], ")"FinSubProcesoFinSubProceso
SubProceso Mezclar
SubProceso MezclarSíNoSíNoSíNoSíNoSubProceso Mezclar(datos, temporal, izquierda, medio, derecha)SubProceso Mezclar(datos,temporal, izquierda, medio,…Definir i, j, k Como EnteroDefinir i, j, k Como Enteroi <- izquierdai <- izquierdaj <- medio + 1j <- medio + 1k <- izquierdak <- izquierdaMientras i <= medio Y j <= derecha Haceri <= medio Y j <=derechaSi datos[i] <= datos[j] Entoncesdatos[i] <= datos[j]temporal[k] <- datos[i]temporal[k] <- datos[i]i <- i + 1i <- i + 1temporal[k] <- datos[j]temporal[k] <- datos[j]j <- j + 1j <- j + 1k <- k + 1k <- k + 1Mientras i <= medio Haceri <= mediotemporal[k] <- datos[i]temporal[k] <- datos[i]i <- i + 1i <- i + 1k <- k + 1k <- k + 1Mientras j <= derecha Hacerj <= derechatemporal[k] <- datos[j]temporal[k] <- datos[j]j <- j + 1j <- j + 1k <- k + 1k <- k + 1Para k <- izquierda Hasta derecha HacerPara k <- izquierda Hastaderechadatos[k] <- temporal[k]datos[k] <- temporal[k]FinSubProcesoFinSubProceso
SubProceso OrdenarPorMezcla
SubProceso OrdenarPorMezclaSíNoSubProceso OrdenarPorMezcla(datos, temporal, izquierda, derecha)SubProceso OrdenarPorMezcla(datos,temporal, izquierda, derecha)Definir medio Como EnteroDefinir medio Como EnteroSi izquierda < derecha Entoncesizquierda < derechamedio <- Trunc((izquierda + derecha) / 2)medio <- Trunc((izquierda +derecha) / 2)OrdenarPorMezcla(datos, temporal, izquierda, medio)OrdenarPorMezcla(datos,temporal, izquierda, medio)OrdenarPorMezcla(datos, temporal, medio + 1, derecha)OrdenarPorMezcla(datos,temporal, medio + 1,derecha)Mezclar(datos, temporal, izquierda, medio, derecha)Mezclar(datos, temporal,izquierda, medio, derecha)FinSubProcesoFinSubProceso

Sample run

This is what the program shows when it runs. The answers typed by the user are highlighted.

¿Cuántos números quieres ordenar? (1 a 512)User answer: 12Antes:   42 60 96 80 54 87 85 17 84 18 5 79 Después: 5 17 18 42 54 60 79 80 84 85 87 96 

Complexity

How much work and memory it needs as the amount of data (n) grows.

Complexity
CaseCost
BestO(n log n)
AverageO(n log n)
WorstO(n log n)
MemoryO(n)

Traits:Stable

Challenge

Print every range that gets merged, with its left and right ends.

Show hint

Add an Escribir at the start of Mezclar; try a small n so there aren't too many lines.

Open in Codoritmo
  • Heap Sort

    Arranges the array as a heap, then takes the largest out again and again.

    Advanced
  • Bubble Sort

    Sorts random numbers by swapping neighbors, and stops as soon as they're in order.

    Intermediate
  • Insertion Sort

    Inserts each number among the sorted ones, like arranging cards in your hand.

    Intermediate