<?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>DEV Community: ABDELKADER ADOUAB</title>
    <description>The latest articles on DEV Community by ABDELKADER ADOUAB (@abadouab).</description>
    <link>https://dev.to/abadouab</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%2F3461236%2F674b1cf8-315a-4aab-b7bc-8468507c6270.png</url>
      <title>DEV Community: ABDELKADER ADOUAB</title>
      <link>https://dev.to/abadouab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abadouab"/>
    <language>en</language>
    <item>
      <title>From Theory to Practice: A Unique Merge-Insertion-Sort Implementation</title>
      <dc:creator>ABDELKADER ADOUAB</dc:creator>
      <pubDate>Wed, 27 Aug 2025 19:56:57 +0000</pubDate>
      <link>https://dev.to/abadouab/from-theory-to-practice-a-unique-merge-insertion-sort-implementation-3blc</link>
      <guid>https://dev.to/abadouab/from-theory-to-practice-a-unique-merge-insertion-sort-implementation-3blc</guid>
      <description>&lt;h1&gt;
  
  
  Merge-insertion Sort, Reimagined: A Tree-Free Implementation with C++ Containers
&lt;/h1&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%2F98ln1qtq54yvejgm400g.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%2F98ln1qtq54yvejgm400g.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sorting is a fundamental problem in computer science, and while algorithms like &lt;strong&gt;Quick Sort&lt;/strong&gt; and &lt;strong&gt;Merge Sort&lt;/strong&gt; are widely used, the quest for the &lt;em&gt;minimum number of comparisons&lt;/em&gt; leads us to more exotic algorithms. One such algorithm is the &lt;strong&gt;Merge-insertion Sort&lt;/strong&gt;, also known as the Ford-Johnson algorithm. It's famous in academic circles for being one of the most comparison-efficient sorting algorithms.&lt;/p&gt;

&lt;p&gt;The classic algorithm, as detailed in Donald Knuth's "The Art of Computer Programming," is often explained using tree-like structures to keep track of element relationships. But what if you're constrained to use standard library containers like &lt;code&gt;std::vector&lt;/code&gt;, &lt;code&gt;std::list&lt;/code&gt;, or &lt;code&gt;std::deque&lt;/code&gt; ? This is where things get tricky.&lt;/p&gt;

&lt;p&gt;Today, I'm sharing a unique implementation of Merge-insertion Sort that elegantly solves this problem. It achieves the optimal number of comparisons prescribed by the theory, all while using a simple nested container approach. The best part? The core recursive function is under 60 lines of code ✨.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Classic Merge-insertion Sort: A Quick Refresher 🧠
&lt;/h2&gt;

&lt;p&gt;The algorithm is a beautiful blend of merging and insertion. Here's the high-level view:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pair &amp;amp; Conquer&lt;/strong&gt;: Group the elements into pairs. Compare each element within a pair, creating "winners" and "losers." This forms a "main chain" (all the winners) and a "pend chain" (all the losers). If there's an odd element out, it's set aside for later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recursive Sort&lt;/strong&gt;: Recursively sort the &lt;strong&gt;main chain&lt;/strong&gt;. Since the main chain is half the size of the original input, you get to the base case quickly. Critically, you must keep track of which loser belongs to which winner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Insert with Jacobsthal&lt;/strong&gt;: Insert the elements from the pend chain into the now-sorted main chain. This is not a simple linear insertion. To maintain the minimum number of comparisons, elements are inserted in a special order determined by &lt;strong&gt;Jacobsthal numbers&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Container Conundrum 🤔
&lt;/h2&gt;

&lt;p&gt;The biggest challenge of implementing this with containers is step #2. When you recursively sort the main chain, how do you remember the original &lt;code&gt;(winner, loser)&lt;/code&gt; pairings?&lt;/p&gt;

&lt;p&gt;A naive approach might be to use a &lt;code&gt;std::map&lt;/code&gt; or another data structure to link winners to losers. However, this often introduces extra comparisons or memory overhead, defeating the purpose of using a comparison-optimal algorithm in the first place. You end up losing the elegant efficiency of the original design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Nested Containers ✨
&lt;/h2&gt;

&lt;p&gt;My implementation overcomes this by changing the very nature of the data we're sorting. Instead of sorting a container of integers (&lt;code&gt;container&amp;lt;int&amp;gt;&lt;/code&gt;), we sort a container of containers: &lt;code&gt;container&amp;lt;container&amp;lt;int&amp;gt;&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's the core idea: Each inner container represents a "group." The actual number we are comparing is always at the &lt;code&gt;front()&lt;/code&gt; of its inner container. The rest of the elements in that inner container are the "losers" that have become associated with it during previous recursive steps.&lt;/p&gt;

&lt;p&gt;When we compare two groups, &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; (which are both containers), we only compare &lt;code&gt;A.front()&lt;/code&gt; and &lt;code&gt;B.front()&lt;/code&gt;. If &lt;code&gt;A.front()&lt;/code&gt; is the winner, we don't just move on. We &lt;strong&gt;append the entire&lt;/strong&gt; &lt;code&gt;B&lt;/code&gt; container to the end of the &lt;code&gt;A&lt;/code&gt; container.&lt;/p&gt;

&lt;p&gt;This way, the loser group is never lost; it's simply chained to its winner. This process perfectly simulates the parent-child relationship of a tree branch, but using only standard container operations.&lt;/p&gt;

&lt;p&gt;When we unwind the recursion, we can easily reconstruct the winner and loser chains by splitting these merged containers. The split point is determined by &lt;code&gt;pair_size = container.front().size() / 2&lt;/code&gt;, which tells us the size of the winner group at that specific recursion level.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Step-by-Step Walkthrough 🔬
&lt;/h2&gt;

&lt;p&gt;To see how the container-based approach works, let's trace the algorithm with a 16-element sequence. The magic happens in two phases: a &lt;strong&gt;recursive descent&lt;/strong&gt; (pairing and merging) and a &lt;strong&gt;recursive ascent&lt;/strong&gt; (splitting and inserting).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initial shuffled sequence:&lt;/strong&gt; &lt;code&gt;{14, 1, 12, 9, 11, 10, 13, 7, 6, 0, 8, 4, 15, 3, 5, 2}&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Phase 1: The Recursive Descent (Pairing &amp;amp; Merging)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The goal here is to recursively sort the "winners." We do this by pairing up our containers, comparing their front elements, and appending the loser's entire container to the winner's.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Entering Level 1: Initial Pairing&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;First, the algorithm takes the 16 raw numbers and groups them into 8 pairs. It compares the numbers in each pair and ensures the larger one is at the front.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;Entering&lt;/span&gt; &lt;span class="n"&gt;Recursion&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-----------&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;

    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&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="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We now have 8 containers, where &lt;code&gt;container.front()&lt;/code&gt; is the "winner" and the rest of the elements are the tracked "losers." The algorithm calls itself with this new set of 8 containers.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Entering Level 2: First Merge&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The 8 containers are now paired up. For example, &lt;code&gt;{14, 1}&lt;/code&gt; is paired with &lt;code&gt;{12, 9}&lt;/code&gt;. Since &lt;code&gt;14 &amp;gt; 12&lt;/code&gt;, the second container is appended to the first, creating &lt;code&gt;{14, 1, 12, 9}&lt;/code&gt;. This reduces the problem size from 8 containers to 4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;Entering&lt;/span&gt; &lt;span class="n"&gt;Recursion&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-----------&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;

    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&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="mi"&gt;4&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how the original pairs are perfectly preserved inside the new, larger containers. The process repeats.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Levels 3 &amp;amp; 4: Merging to the Base Case&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The same logic applies, halving the number of containers at each step until only one remains.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Level 3:&lt;/strong&gt; 4 containers are merged into 2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Level 4:&lt;/strong&gt; 2 containers are merged into 1.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;Entering&lt;/span&gt; &lt;span class="n"&gt;Recursion&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;-----------&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The algorithm has now hit the base case (&lt;code&gt;container.size() &amp;lt;= 1&lt;/code&gt;). The recursive descent is over. Now, the magic happens as we unwind.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Phase 2: The Ascent — Unwinding with Precision 🚀&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As the recursion unwinds, the real magic begins. This phase is not just a simple insertion; it's a highly optimized process driven by two key principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Jacobsthal Looping Engine:&lt;/strong&gt; Instead of inserting losers (&lt;code&gt;b1, b2, b3,...&lt;/code&gt;) in a simple linear order, the algorithm uses Jacobsthal numbers to pick them in a special sequence (&lt;code&gt;b1&lt;/code&gt;, then &lt;code&gt;b3, b2&lt;/code&gt;, then &lt;code&gt;b5, b4&lt;/code&gt;, etc.). This order is designed to maximize the information gained from each binary search, as we insert elements from larger, more uncertain positions first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Optimized Binary Search Range:&lt;/strong&gt; This is the secret sauce. When we are ready to insert a loser &lt;code&gt;b_k&lt;/code&gt;, we &lt;strong&gt;do not&lt;/strong&gt; need to search the entire sorted &lt;code&gt;main_chain&lt;/code&gt;. The algorithm guarantees that &lt;code&gt;b_k&lt;/code&gt; is smaller than its winner &lt;code&gt;a_k&lt;/code&gt;, which is in turn smaller than all subsequent winners (&lt;code&gt;a_{k+1}, a_{k+2}, ...&lt;/code&gt;). Therefore, we only need to perform a binary search for &lt;code&gt;b_k&lt;/code&gt;'s position within the &lt;code&gt;main_chain&lt;/code&gt; &lt;strong&gt;up to the position of&lt;/strong&gt; &lt;code&gt;a_k&lt;/code&gt;. This drastically reduces the size of each search and is fundamental to keeping the comparison count at its theoretical minimum.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's see this in action, level by level.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Split: Extracting Losers from the Main Chain ✂️&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As the recursion unwinds, our main container holds groups of merged winners and losers. The first action is to &lt;strong&gt;split&lt;/strong&gt; them. We iterate through each group, extracting the "loser" elements into a temporary list (&lt;code&gt;pend_chain&lt;/code&gt;), while the sorted "winner" elements remain in the original container, forming the foundation for our final sorted list.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;code&gt;main_chain&lt;/code&gt; refers to the original container after the losers have been extracted and moved into the temporary &lt;code&gt;pend_chain&lt;/code&gt;. The insertions then happen back into this &lt;code&gt;main_chain&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Leaving Level 4: The First Split &amp;amp; Insertion&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The algorithm splits the single, massive container using &lt;code&gt;pair_size = 8&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;Leaving&lt;/span&gt; &lt;span class="n"&gt;Recursion&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;-------&lt;/span&gt; &lt;span class="n"&gt;Pair&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="n"&gt;Winners&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a1&lt;/span&gt;

&lt;span class="n"&gt;Losers&lt;/span&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pend_chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Insertion Process:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual Insert:&lt;/strong&gt; With only one loser (&lt;code&gt;b1&lt;/code&gt;), the process is simple. We insert &lt;code&gt;b1&lt;/code&gt; at the front of the &lt;code&gt;main_chain&lt;/code&gt;. No search is needed. All Insertions happen &lt;strong&gt;in-place&lt;/strong&gt;, modifying the container that holds the &lt;code&gt;main_chain&lt;/code&gt; rather than creating a new one.&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Leaving Level 3: Reconstructing a Larger Chain&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Here, &lt;code&gt;pair_size = 4&lt;/code&gt;. The function splits the two groups.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;Leaving&lt;/span&gt; &lt;span class="n"&gt;Recursion&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-------&lt;/span&gt; &lt;span class="n"&gt;Pair&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="n"&gt;Winners&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a1&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a2&lt;/span&gt;

&lt;span class="n"&gt;Losers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pend_chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b1&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Insertion Process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual Insert:&lt;/strong&gt; Loser &lt;code&gt;b1&lt;/code&gt; is inserted at the front of the &lt;code&gt;main_chain&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jacobsthal Loop:&lt;/strong&gt; The next group to insert is for Jacobsthal indices &lt;code&gt;(1, 3]&lt;/code&gt;. This includes &lt;code&gt;b2&lt;/code&gt;. To insert &lt;code&gt;b2&lt;/code&gt;, we use our optimized search.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* **Insert** `b2` (`{8,...}`): We only need to binary search in the `main_chain` up to the position of its winner, `a2`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Leaving Level 2: More Granularity&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The process continues with the sorted list of 4 groups. The &lt;code&gt;pair_size&lt;/code&gt; is now &lt;code&gt;4 / 2 = 2&lt;/code&gt;. The containers are split, creating a &lt;code&gt;main_chain&lt;/code&gt; of 4 winners and a corresponding &lt;code&gt;pend_chain&lt;/code&gt; of 4 losers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;Leaving&lt;/span&gt; &lt;span class="n"&gt;Recursion&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-------&lt;/span&gt; &lt;span class="n"&gt;Pair&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="n"&gt;Winners&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a1&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a2&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a3&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// a4&lt;/span&gt;

&lt;span class="n"&gt;Losers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pend_chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b1&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b2&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b3&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// b4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Insertion Process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual Insert:&lt;/strong&gt; Loser &lt;code&gt;b1&lt;/code&gt; (&lt;code&gt;{6, 0}&lt;/code&gt;) is inserted at the front of the &lt;code&gt;main_chain&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jacobsthal Loop (prev=1, next=3):&lt;/strong&gt; This group includes losers &lt;code&gt;b3&lt;/code&gt; and &lt;code&gt;b2&lt;/code&gt;. We insert them in descending order:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* First, Insert `b3` (`{12, 9}`). The binary search is performed only on the part of the `main_chain` up to the position of its winner, `a3` (`{14, 1}`).

* Next, Insert `b2` (`{11, 10}`). The search is limited to the range up to its winner, `a2` (`{13, 7}`).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Jacobsthal Loop (prev=3, next=5):&lt;/strong&gt; This group includes the last remaining loser, &lt;code&gt;b4&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* Insert `b4` (`{5, 2}`). The search is limited to the range up to its winner, `a4` (`{15, 3}`).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After this, the function returns a single, sorted list of 8 groups to the final level.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Leaving Level 1: The Final, Precise Insertion&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This is where the optimizations are most visible. &lt;code&gt;pair_size = 1&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Winners (main_chain): {  5,  6,  8, 11, 12, 13, 14, 15  }
//                      a1  a2  a3  a4  a5  a6  a7  a8

Losers  (pend_chain): {  2,  0,  4, 10,  9,  7,  1,  3  }
//                      b1  b2  b3  b4  b5  b6  b7  b8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Insertion Process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual Insert:&lt;/strong&gt; &lt;code&gt;b1&lt;/code&gt; (&lt;code&gt;2&lt;/code&gt;) is inserted at the front of the &lt;code&gt;main_chain&lt;/code&gt;. No search needed. The chain is now &lt;code&gt;{2, 5, 6, ...}&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jacobsthal Loop Engine Begins:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* **Group (1, 3\]:** Process indices 3, 2.

    * **Insert** `b3` (4): Perform a binary search (`lower_bound`) on the `main_chain` but **only up to the position of** `a3` (8).

    * **Insert** `b2` (0): Perform a binary search on the `main_chain` **only up to the position of** `a2` (6).

* **Group (3, 5\]:** Process indices 5, 4.

    * **Insert** `b5` ( 9): Search for its position **up to** `a5` (12).

    * **Insert** `b4` (10): Search for its position **up to** `a4` (11).

* **Group (5, 11\]:** Our list of losers ends at index 8, So we process indices 8, 7, 6.

    * **Insert** `b8` ( 3): Search for its position **up to** `a8` (15).

    * **Insert** `b7` ( 1): Search for its position **up to** `a7` (14).

    * **Insert** `b6` ( 7): Search for its position **up to** `a6` (13).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;By precisely controlling both the &lt;strong&gt;order of insertion&lt;/strong&gt; (Jacobsthal) and the &lt;strong&gt;range of each search&lt;/strong&gt; (up to &lt;code&gt;a_k&lt;/code&gt;), the algorithm avoids redundant comparisons, achieving its famed efficiency while operating in-place on a single growing container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Merge-insertion Sort Pseudocode
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function MergeInsertionSort(container_of_containers C):
    // Base case: a list of 0 or 1 is already sorted.
    if C.size() &amp;lt;= 1:
        return

    // Handle any odd element out by setting it aside.
    leftover = handleOddElement(C)

    // Phase 1: Pair up, compare fronts, and merge the losers
    // container into the winners. This halves the number of containers.
    for each adjacent pair (A, B) in C:
        if A.front() &amp;lt; B.front():
            swap(A, B)
        A.append_contents_of(B)
        // Remove B, as its contents are now merged into A.
        C.erase(B)

    // Recursive call on the smaller set of winner-containers.
    MergeInsertionSort(C)

    // --- Unwinding Phase ---

    // Calculate pair_size to know where the split between
    // a winner and its original loser(s) is located.
    pair_size = C.front().size() / 2

    // C now holds the main_chain of winners. Extract the
    // pend_chain of losers from within each container.
    pend_chain = extract_losers(C, pair_size)

    // insert the pend_chain back into the main_chain (C)
    // using the optimal Jacobsthal insert sequence.
    insertion_using_jacobsthal(C, pend_chain, leftover)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion &amp;amp; Key Takeaways 🚀
&lt;/h2&gt;

&lt;p&gt;This container-based implementation of Merge-insertion Sort demonstrates that it's possible to adhere to the algorithm's theoretical efficiency even when faced with practical constraints. By rethinking the data structure, we can simulate the tree-like dependencies required by the algorithm in a clean, concise, and efficient manner.&lt;/p&gt;

&lt;p&gt;This approach not only provides a performant sorting solution but also serves as a great example of how abstract algorithmic concepts can be translated into practical code with a bit of creative thinking.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>cpp</category>
      <category>programming</category>
      <category>datastructures</category>
    </item>
  </channel>
</rss>
