<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Juan Carlos Garcia Esquivel</title>
    <description>The latest articles on Forem by Juan Carlos Garcia Esquivel (@jcmexdev).</description>
    <link>https://forem.com/jcmexdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F452639%2Fd6cc5bcd-de66-44f8-9a12-357ce3084efc.jpeg</url>
      <title>Forem: Juan Carlos Garcia Esquivel</title>
      <link>https://forem.com/jcmexdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jcmexdev"/>
    <language>en</language>
    <item>
      <title>Time Complexity y Big O: Prediciendo el Futuro de tu Código</title>
      <dc:creator>Juan Carlos Garcia Esquivel</dc:creator>
      <pubDate>Tue, 21 Apr 2026 21:11:12 +0000</pubDate>
      <link>https://forem.com/jcmexdev/time-complexity-y-big-o-prediciendo-el-futuro-de-tu-codigo-3h86</link>
      <guid>https://forem.com/jcmexdev/time-complexity-y-big-o-prediciendo-el-futuro-de-tu-codigo-3h86</guid>
      <description>&lt;p&gt;¿Alguna vez has escrito código que vuela con 10 registros en tu máquina local, pero hace colapsar todo el sistema cuando procesa 10,000 en el servidor? Medir la calidad de nuestros algoritmos usando milisegundos es una trampa mortal de desarrollo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La complejidad temporal es la disciplina que nos permite medir el crecimiento del costo computacional (operaciones) a medida que aumenta el tamaño de la entrada (&lt;code&gt;n&lt;/code&gt;). Utilizando la notación Big O, podemos predecir con exactitud la escalabilidad técnica y el consumo de recursos independientemente del hardware o entorno de ejecución donde esté montado el sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El Problema: Milisegundos vs. Operaciones
&lt;/h2&gt;

&lt;p&gt;Es común pensar que si una función tarda solo 10ms en nuestra laptop, es el diseño perfecto. Sin embargo, el tiempo de ejecución es caótico y está viciado por variables fuera de nuestro control: la potencia del CPU en el momento, el recolector de basura de tu lenguaje o la carga general del sistema.&lt;/p&gt;

&lt;p&gt;Si llevamos un código poco óptimo (digamos cuadradito &lt;code&gt;O(n^2)&lt;/code&gt;) a un ecosistema con millones de transacciones por segundo, los milisegundos inofensivos de tu computadora de escritorio se transformarán en horas de embotellamientos, picos estratosféricos en tus gastos de la nube e inclusive caídas abruptas de servidores por &lt;em&gt;Out of Memory&lt;/em&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamentos de la Notación Big O (&lt;code&gt;O&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;El análisis asintótico a través de la notación &lt;strong&gt;Big O&lt;/strong&gt; nos permite ignorar distracciones y enfocarnos puramente en el incremento del algoritmo a largo plazo. Aplicamos entonces 3 reglas de oro:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ignorar las Constantes
&lt;/h3&gt;

&lt;p&gt;Si un algoritmo emplea 2 operaciones por cada elemento para resolverse (&lt;code&gt;2n&lt;/code&gt;) y otro emplea solo 1 operación &lt;code&gt;(n)&lt;/code&gt;, a largo plazo &lt;strong&gt;ambos&lt;/strong&gt; crecerán al mismo ritmo de forma lineal. Big O se interesa únicamente en la tendencia de esa tasa de crecimiento; el 2 constante es irrelevante porque en escalas masivas es diminuto (&lt;code&gt;O(n)&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. El Dominio del Mayor Término
&lt;/h3&gt;

&lt;p&gt;Supongamos que tu función completa &lt;code&gt;n^2 + n + 10&lt;/code&gt; operaciones. El impacto de los números solitarios y de &lt;code&gt;n&lt;/code&gt; se vuelven invisibles comparados al daño masivo que provoca &lt;code&gt;n^2&lt;/code&gt; cuando la cantidad de entrada &lt;code&gt;n&lt;/code&gt; equivale a &lt;code&gt;1,000,000&lt;/code&gt;. En consecuencia, ese pedazo de código siempre será tratado como si fuera &lt;code&gt;O(n^2)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Asumir el Peor de los Casos
&lt;/h3&gt;

&lt;p&gt;Al diseñar un puente de ingeniería, no asumes que transitarán autos ligeros en un día asoleado; lo construyes para resistir a docenas de camiones comerciales en medio de un huracán. Diseñar de manera predeterminada para soportar el entorno más hostil e imputs complejos garantiza que cualquier otro escenario menor será irrelevante.&lt;/p&gt;

&lt;h2&gt;
  
  
  La Jerarquía del Rendimiento y Complejidad
&lt;/h2&gt;

&lt;p&gt;Aquí observamos cómo progresan los tipos de complejidad cuando la cantidad de datos (&lt;code&gt;n&lt;/code&gt;) escala exponencialmente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoanbjc2phg575gtarie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoanbjc2phg575gtarie.png" alt="Crecimiento Algorítmico (Esfuerzo vs n)" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constante &lt;code&gt;O(1)&lt;/code&gt;:&lt;/strong&gt; Rendimiento óptimo sin importar si le entregamos 5 registros o 5 billones de transacciones, todo el procesamiento dura lo mismo (ej: buscar en un Hash Map).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logarítmica &lt;code&gt;O(log n)&lt;/code&gt;:&lt;/strong&gt; El costo crece absurdamente lento en proporción al número de registros (ej. dividir sistemáticamente todo a la mitad).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lineal &lt;code&gt;O(n)&lt;/code&gt;:&lt;/strong&gt; Todo crece uniformemente. Dos usuarios ocupan lo que toman dos usuarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linearítmica &lt;code&gt;O(n log n)&lt;/code&gt;:&lt;/strong&gt; Generalmente es el margen estandar de los algoritmos de ordenamiento altamente eficientes (como Quick Sort o Merge Sort).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cuadrática &lt;code&gt;O(n^2)&lt;/code&gt;:&lt;/strong&gt; Peligroso si se permite en la naturaleza, como lo son bucles anidados sobreciendo todas las combinaciones que estallan con facilidad.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Aplicación Práctica y Trade-Offs
&lt;/h2&gt;

&lt;p&gt;Pensar en Time Complexity no te dicta escribir cada byte de código para que sea obligatoriamente un &lt;code&gt;O(log n)&lt;/code&gt;. Se trata de ser consciente de los sacrificios técnicos (Trade-Offs).&lt;/p&gt;

&lt;p&gt;Por ejemplo, implementar código complejo de tipo Cuadrático puede estar completamente justificado en empresas y prototipos MVP en donde el Time-to-Market manda y el arreglo a procesar siempre será un subconjunto mínimo (ej: categorizar los 12 meses del año). Entregar la lógica clara y barata triunfa por encima de semanas construyendo el código más eficiente existente. &lt;/p&gt;

&lt;p&gt;Por otra parte, tener un algoritmo de complejidad Temporal inmediata puede requerir almacenar muchísimos datos previos temporales en Caché (Memoria Cuadrática o Espacial Elevada). Resultando en OOM, matando procesos de Cloud y desacomodando por completo el hardware. Se debe nivelar siempre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Predecir y calcular mentalmente los estragos y colisiones que nuestra arquitectura tendrá a largo plazo, define el límite entre un programador junior y un ingeniero de software senior.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analiza y calcula basándote en el peor escenario posible.&lt;/li&gt;
&lt;li&gt;Simplifica variables irrelevantes de velocidad, concéntrate de lleno en elementos predominantes del patrón de crecimiento.&lt;/li&gt;
&lt;li&gt;Recuerda que la balanza está sostenida en dos placas: Time Complexity y Space Complexity. Si vacías por completo un lado, puede que el otro peso destruya los costos de la plataforma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y tú, ¿Alguna vez tuviste que tirar a la basura una implementación completa luego de darte cuenta de que su consumo asintótico lo volvía un cuello de botella terrible? Te leo en los comentarios.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>performance</category>
      <category>software</category>
    </item>
    <item>
      <title>Guía Definitiva de Merge Sort: El Algoritmo de Divide y Vencerás</title>
      <dc:creator>Juan Carlos Garcia Esquivel</dc:creator>
      <pubDate>Mon, 20 Apr 2026 16:26:09 +0000</pubDate>
      <link>https://forem.com/jcmexdev/guia-definitiva-de-merge-sort-el-algoritmo-de-divide-y-venceras-h1n</link>
      <guid>https://forem.com/jcmexdev/guia-definitiva-de-merge-sort-el-algoritmo-de-divide-y-venceras-h1n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Merge Sort es un algoritmo de ordenamiento basado en el paradigma &lt;strong&gt;Divide y Vencerás&lt;/strong&gt;. Divide recursivamente el arreglo en mitades hasta llegar a elementos individuales (ordenados por definición) y luego los mezcla de forma ordenada. Garantiza un rendimiento de &lt;strong&gt;O(n log n)&lt;/strong&gt; en todos los casos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El algoritmo &lt;strong&gt;Merge Sort&lt;/strong&gt; (u Ordenamiento por Mezcla) es uno de los pilares del ordenamiento en ciencias de la computación. Basado matemáticamente en el paradigma &lt;strong&gt;Divide y Vencerás&lt;/strong&gt;, se destaca como una herramienta extremadamente poderosa cuando requerimos estabilidad y rendimiento garantizado.&lt;/p&gt;

&lt;p&gt;En este artículo, exploraremos qué lo hace tan especial, cómo implementarlo de manera limpia y una táctica avanzada para optimizar su consumo de memoria en entornos de producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Merge Sort?
&lt;/h2&gt;

&lt;p&gt;Su funcionamiento se divide en tres fases lógicas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Divide:&lt;/strong&gt; El algoritmo parte el arreglo a la mitad de forma recursiva hasta llegar a elementos individuales, los cuales se consideran ya ordenados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conquista (Conquer):&lt;/strong&gt; Cada sub-división se resuelve y ordena de forma independiente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combina (Merge):&lt;/strong&gt; Se unen o "mezclan" las piezas usando algoritmos de dos punteros (&lt;em&gt;two-pointer technique&lt;/em&gt;), garantizando que las combinaciones resultantes sigan estando ordenadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A diferencia del popular &lt;em&gt;QuickSort&lt;/em&gt;, Merge Sort siempre asegura una complejidad de tiempo de ejecución de &lt;strong&gt;O(n log n)&lt;/strong&gt; en cualquier escenario (mejor caso, caso promedio y peor caso). Sin embargo, este rendimiento constante tiene un costo: mayor uso de la memoria RAM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualización Paso a Paso
&lt;/h2&gt;

&lt;p&gt;Para ver cómo el paradigma de "Divide y Vencerás" trabaja materialmente en un arreglo de ejemplo (n=6), te compartimos este mapa jerárquico del proceso de división.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcfimqw94sagex1sxrsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcfimqw94sagex1sxrsc.png" alt="Diagrama de árbol de Merge Sort mostrando un arreglo de 6 elementos que se divide hasta su caso base y luego se combina ordenadamente." width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez reducidos a su mínima expresión matemática (n=1), el algoritmo comienza a ascender combinando (&lt;code&gt;merge&lt;/code&gt;). Así es como una tabla de estado final interactúa entre un arreglo izquierdo (&lt;code&gt;L&lt;/code&gt;) y derecho (&lt;code&gt;R&lt;/code&gt;) utilizando &lt;code&gt;Two-Pointers&lt;/code&gt;:&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementación Básica en Go
&lt;/h2&gt;

&lt;p&gt;A continuación, mostramos una implementación muy legible en Go. Este bloque se enfoca en que la lógica algorítmica sea directa y fácil de depurar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;sortList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unsortedList&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unsortedList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;unsortedList&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;midpoint&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;leftList&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sortList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unsortedList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;midpoint&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;rightList&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sortList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unsortedList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;midpoint&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;resultList&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;leftPointer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rightPointer&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;leftPointer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;midpoint&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;rightPointer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;midpoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;leftPointer&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;midpoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;resultList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rightList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rightPointer&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;rightPointer&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rightPointer&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;midpoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;resultList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leftList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;leftPointer&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;leftPointer&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;leftList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;leftPointer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rightList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rightPointer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;resultList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leftList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;leftPointer&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;leftPointer&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;resultList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rightList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rightPointer&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;rightPointer&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resultList&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta implementación es un excelente &lt;strong&gt;MVP&lt;/strong&gt; (Minimum Viable Product). No obstante, un desarrollador experimentado notará rápidamente un área de oportunidad: hay una constante creación de sectores de memoria, o "slices". Crear un nuevo &lt;code&gt;slice&lt;/code&gt; de tamaño &lt;code&gt;n&lt;/code&gt; en cada ciclo invoca implícitamente la reserva de memoria dinámica, impactando el rendimiento global por la recolección de basura (&lt;em&gt;Garbage Collector&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimización Clave: El Patrón de Búfer Compartido
&lt;/h2&gt;

&lt;p&gt;Si se requiere una versión optimizada, destinada a librerías estándar o plataformas de alta escala, la mejor solución es el &lt;strong&gt;Patrón de Búfer Compartido&lt;/strong&gt; (&lt;em&gt;Shared Buffer Pattern&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Este enfoque se basa en asignar un único arreglo &lt;code&gt;temp&lt;/code&gt; con capacidad para &lt;code&gt;N&lt;/code&gt; elementos, antes de comenzar el proceso de recursividad. Ese &lt;code&gt;temp&lt;/code&gt; sirve como fotocopiadora compartida. Las funciones solo leen desde ahí, reescribiendo la posición final directamente sobre los punteros iniciales de forma económica.&lt;/p&gt;

&lt;p&gt;Observemos este modelo optimizado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;SortList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Un solo buffer auxiliar compartido para toda la ejecución&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;

        &lt;span class="n"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gracias a esto, reducimos la memoria a &lt;strong&gt;O(N) estrictamente&lt;/strong&gt;; sin importar cuántas uniones o subdivisiones ocurran, jamás excederemos el tamaño original del búfer. Esta técnica demuestra dominio sobre las estructuras de datos nativas y el manejo de recolección de basura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;El uso de &lt;em&gt;Merge Sort&lt;/em&gt; brilla por su solidez matemática. Si bien el alto uso de memoria frecuentemente inclina a los programadores hacia QuickSort, optimizaciones como el &lt;em&gt;Shared Buffer&lt;/em&gt; lo devuelven a lugares protagónicos, especialmente en casos como la gestión subyacente del ordenamiento constante e ininterrumpido a gran escala. Además, para las listas enlazadas, es la primera opción indisputable, puesto que el acceso secuencial es el núcleo fuerte de &lt;em&gt;Merge Sort&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>sorting</category>
      <category>go</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
