1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-17 06:24:24 +03:00
inform7/docs/BasicInformKit/S-srt.html
Graham Nelson 1268a0f40e Colonised
2020-04-14 17:56:54 +01:00

292 lines
32 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Sort Template</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Extensions</h2><ul>
<li><a href="../basic_inform/index.html">basic_inform</a></li>
<li><a href="../standard_rules/index.html">standard_rules</a></li>
</ul><h2>Kits</h2><ul>
<li><a href="index.html"><span class="selectedlink">BasicInformKit</span></a></li>
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Sort Template' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Sort Template</b></li></ul><p class="purpose">To sort arrays.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Storage</a></li><li><a href="#SP2">&#167;2. Front End</a></li><li><a href="#SP3">&#167;3. Sort Range</a></li><li><a href="#SP4">&#167;4. Comparison and Exchange</a></li><li><a href="#SP5">&#167;5. 4W37 Sort</a></li><li><a href="#SP6">&#167;6. Insertion Sort</a></li><li><a href="#SP7">&#167;7. In-Place Mergesort</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Storage. </b>We are required to use a stable sorting algorithm with very low, ideally zero,
auxiliary storage requirement. Exchanges are generally slower than comparisons
for the typical application (sorting tables, where entire rows must be
exchanged whereas only entries in a single column need be compared).
</p>
<p class="inwebparagraph">In fact, we store some details in global variables for convenience and to
avoid filling the stack with copies, but otherwise we will hardly need any
auxiliary storage.
</p>
<pre class="display">
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">I7S_Tab</span><span class="plain">; </span><span class="comment">The array to be sorted, which can have almost any format</span>
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">I7S_Col</span><span class="plain">; </span><span class="comment">The "column number" in the array, if any</span>
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">I7S_Dir</span><span class="plain">; </span><span class="comment">The direction of sorting: ascending (1) or descending (-1)</span>
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">I7S_Swap</span><span class="plain">; </span><span class="comment">The current routine for swapping two fields</span>
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">I7S_Comp</span><span class="plain">; </span><span class="comment">The current routine for comparing two fields</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Front End. </b>To perform a sort, we first call <code class="display"><span class="extract">SetSortDomain</span></code> to declare the swap and
compare functions to be used, and then call <code class="display"><span class="extract">SortArray</span></code> actually to sort. (It
would be nice to combine these in a single call, but I6 allows a maximum of
7 call arguments for a routine, and that would make 8.) These are the only
two routines which should ever be called from outside of this template
segment.
</p>
<p class="inwebparagraph">The swap and compare functions are expected to take two arguments, which
are the field numbers of the fields being swapped or compared, where fields
are numbered from 1. Comparison is like <code class="display"><span class="extract">strcmp</span></code>: it returns 0 on equality,
and then is positive or negative according to which of the fields is
greater in value.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">SetSortDomain</span><span class="plain"> </span><span class="identifier">swapf</span><span class="plain"> </span><span class="identifier">compf</span><span class="plain">;</span>
<span class="identifier">I7S_Swap</span><span class="plain"> = </span><span class="identifier">swapf</span><span class="plain">;</span>
<span class="identifier">I7S_Comp</span><span class="plain"> = </span><span class="identifier">compf</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">SortArray</span><span class="plain"> </span><span class="identifier">tab</span><span class="plain"> </span><span class="identifier">col</span><span class="plain"> </span><span class="identifier">dir</span><span class="plain"> </span><span class="identifier">size</span><span class="plain"> </span><span class="identifier">algorithm</span><span class="plain">;</span>
<span class="identifier">I7S_Tab</span><span class="plain"> = </span><span class="identifier">tab</span><span class="plain">;</span>
<span class="identifier">I7S_Col</span><span class="plain"> = </span><span class="identifier">col</span><span class="plain">;</span>
<span class="identifier">I7S_Dir</span><span class="plain"> = </span><span class="identifier">dir</span><span class="plain">;</span>
<span class="identifier">SortRange</span><span class="plain">(0, </span><span class="identifier">size</span><span class="plain">, </span><span class="identifier">algorithm</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Sort Range. </b>This routine sorts a range of fields \(x\leq i &lt; y\) within the array. Fields
are numbered from 0. The supplied <code class="display"><span class="extract">algorithm</span></code> is an I6 routine to implement
a particular sorting algorithm; if it is not supplied, then in-place merge
sort is used by default.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">SortRange</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> </span><span class="identifier">algorithm</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">y</span><span class="plain"> - </span><span class="identifier">x</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">algorithm</span><span class="plain">) {</span>
<span class="plain">(</span><span class="identifier">algorithm</span><span class="plain">)(</span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">InPlaceMergeSortAlgorithm</span><span class="plain">(</span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Comparison and Exchange. </b>These are instrumented versions of how to swap and compare fields; note that
the swap and compare functions are expected to number the fields from 1, not
from 0. (This is convenient both for tables and lists, where rows and entries
respectively are both numbered from 1.) The only access which the sorting
algorithms have to the actual data being sorted is through these routines.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">CompareFields</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I7S_Dir</span><span class="plain">*</span><span class="identifier">I7S_Comp</span><span class="plain">(</span><span class="identifier">I7S_Tab</span><span class="plain">, </span><span class="identifier">I7S_Col</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">+1, </span><span class="identifier">y</span><span class="plain">+1, </span><span class="identifier">I7S_Dir</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">ExchangeFields</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">;</span>
<span class="identifier">r</span><span class="plain"> = </span><span class="identifier">I7S_Swap</span><span class="plain">(</span><span class="identifier">I7S_Tab</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">+1, </span><span class="identifier">y</span><span class="plain">+1);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. 4W37 Sort. </b>We now present three alternative sorting algorithms.
</p>
<p class="inwebparagraph">The first is the one used in builds up to and including 4W37: note that this is
not quite bubble sort, and that it is unstable. It is now no longer used, but
is so short that we might as well keep it in the code base in case anyone needs
to resurrect a very early I7 project.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">OldSortAlgorithm</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span>
<span class="identifier">f</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">y</span><span class="plain"> - </span><span class="identifier">x</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) {</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="reserved">false</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">x</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">y</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+1:</span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">y</span><span class="plain">:</span><span class="identifier">j</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CompareFields</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">ExchangeFields</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">); </span><span class="identifier">f</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Insertion Sort. </b>A stable algorithm which has \(O(n^2)\) running time and therefore cannot be
used with large arrays, but which has good performance on nearly sorted tables,
and which has very low overhead.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">InsertionSortAlgorithm</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span>
<span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">to</span><span class="plain"> &gt; </span><span class="identifier">from</span><span class="plain">+1) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">+1: </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="reserved">to</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">: </span><span class="identifier">j</span><span class="plain"> &gt; </span><span class="identifier">from</span><span class="plain">: </span><span class="identifier">j</span><span class="plain">--) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CompareFields</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1) &lt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">ExchangeFields</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. In-Place Mergesort. </b>A stable algorithm with \(O(n\log n)\) running time, at some stack cost, and
which is generally good for nearly sorted tables, but which is also complex
and has some overhead. The code here mostly follows Thomas Baudel's
implementation, which in turn follows the <code class="display"><span class="extract">C++</span></code> STL library.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">InPlaceMergeSortAlgorithm</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span>
<span class="identifier">middle</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">to</span><span class="plain"> - </span><span class="identifier">from</span><span class="plain"> &lt; </span><span class="constant">12</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">to</span><span class="plain"> - </span><span class="identifier">from</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">InsertionSortAlgorithm</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">middle</span><span class="plain"> = (</span><span class="identifier">from</span><span class="plain"> + </span><span class="reserved">to</span><span class="plain">)/2;</span>
<span class="identifier">InPlaceMergeSortAlgorithm</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">middle</span><span class="plain">);</span>
<span class="identifier">InPlaceMergeSortAlgorithm</span><span class="plain">(</span><span class="identifier">middle</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">);</span>
<span class="identifier">IPMS_Merge</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">middle</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">, </span><span class="identifier">middle</span><span class="plain">-</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">to</span><span class="plain"> - </span><span class="identifier">middle</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">IPMS_Lower</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">val</span>
<span class="identifier">len</span><span class="plain"> </span><span class="identifier">half</span><span class="plain"> </span><span class="identifier">mid</span><span class="plain">;</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="reserved">to</span><span class="plain"> - </span><span class="identifier">from</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">len</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">half</span><span class="plain"> = </span><span class="identifier">len</span><span class="plain">/2;</span>
<span class="identifier">mid</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain"> + </span><span class="identifier">half</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CompareFields</span><span class="plain">(</span><span class="identifier">mid</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">from</span><span class="plain"> = </span><span class="identifier">mid</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="identifier">len</span><span class="plain"> - </span><span class="identifier">half</span><span class="plain"> -1;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> = </span><span class="identifier">half</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">IPMS_Upper</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">val</span>
<span class="identifier">len</span><span class="plain"> </span><span class="identifier">half</span><span class="plain"> </span><span class="identifier">mid</span><span class="plain">;</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="reserved">to</span><span class="plain"> - </span><span class="identifier">from</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">len</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">half</span><span class="plain"> = </span><span class="identifier">len</span><span class="plain">/2;</span>
<span class="identifier">mid</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain"> + </span><span class="identifier">half</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CompareFields</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">mid</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="identifier">half</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">from</span><span class="plain"> = </span><span class="identifier">mid</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="identifier">len</span><span class="plain"> - </span><span class="identifier">half</span><span class="plain"> -1;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">IPMS_Reverse</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> &lt; </span><span class="reserved">to</span><span class="plain">) {</span>
<span class="identifier">ExchangeFields</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">++, </span><span class="reserved">to</span><span class="plain">--);</span>
<span class="plain">}</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">IPMS_Rotate</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="identifier">mid</span><span class="plain"> </span><span class="reserved">to</span>
<span class="identifier">n</span><span class="plain"> </span><span class="identifier">val</span><span class="plain"> </span><span class="identifier">shift</span><span class="plain"> </span><span class="identifier">p1</span><span class="plain"> </span><span class="identifier">p2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain">==</span><span class="identifier">mid</span><span class="plain">) || (</span><span class="identifier">mid</span><span class="plain">==</span><span class="reserved">to</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">IPMS_Reverse</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">mid</span><span class="plain">-1);</span>
<span class="identifier">IPMS_Reverse</span><span class="plain">(</span><span class="identifier">mid</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">-1);</span>
<span class="identifier">IPMS_Reverse</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">-1);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">IPMS_Merge</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="identifier">pivot</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">len1</span><span class="plain"> </span><span class="identifier">len2</span>
<span class="identifier">first_cut</span><span class="plain"> </span><span class="identifier">second_cut</span><span class="plain"> </span><span class="identifier">len11</span><span class="plain"> </span><span class="identifier">len22</span><span class="plain"> </span><span class="identifier">new_mid</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">len1</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">len2</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">len1</span><span class="plain">+</span><span class="identifier">len2</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CompareFields</span><span class="plain">(</span><span class="identifier">pivot</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">ExchangeFields</span><span class="plain">(</span><span class="identifier">pivot</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">len1</span><span class="plain"> &gt; </span><span class="identifier">len2</span><span class="plain">) {</span>
<span class="identifier">len11</span><span class="plain"> = </span><span class="identifier">len1</span><span class="plain">/2;</span>
<span class="identifier">first_cut</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain"> + </span><span class="identifier">len11</span><span class="plain">;</span>
<span class="identifier">second_cut</span><span class="plain"> = </span><span class="identifier">IPMS_Lower</span><span class="plain">(</span><span class="identifier">pivot</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">, </span><span class="identifier">first_cut</span><span class="plain">);</span>
<span class="identifier">len22</span><span class="plain"> = </span><span class="identifier">second_cut</span><span class="plain"> - </span><span class="identifier">pivot</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">len22</span><span class="plain"> = </span><span class="identifier">len2</span><span class="plain">/2;</span>
<span class="identifier">second_cut</span><span class="plain"> = </span><span class="identifier">pivot</span><span class="plain"> + </span><span class="identifier">len22</span><span class="plain">;</span>
<span class="identifier">first_cut</span><span class="plain"> = </span><span class="identifier">IPMS_Upper</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pivot</span><span class="plain">, </span><span class="identifier">second_cut</span><span class="plain">);</span>
<span class="identifier">len11</span><span class="plain"> = </span><span class="identifier">first_cut</span><span class="plain"> - </span><span class="identifier">from</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">IPMS_Rotate</span><span class="plain">(</span><span class="identifier">first_cut</span><span class="plain">, </span><span class="identifier">pivot</span><span class="plain">, </span><span class="identifier">second_cut</span><span class="plain">);</span>
<span class="identifier">new_mid</span><span class="plain"> = </span><span class="identifier">first_cut</span><span class="plain"> + </span><span class="identifier">len22</span><span class="plain">;</span>
<span class="identifier">IPMS_Merge</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">first_cut</span><span class="plain">, </span><span class="identifier">new_mid</span><span class="plain">, </span><span class="identifier">len11</span><span class="plain">, </span><span class="identifier">len22</span><span class="plain">);</span>
<span class="identifier">IPMS_Merge</span><span class="plain">(</span><span class="identifier">new_mid</span><span class="plain">, </span><span class="identifier">second_cut</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">, </span><span class="identifier">len1</span><span class="plain"> - </span><span class="identifier">len11</span><span class="plain">, </span><span class="identifier">len2</span><span class="plain"> - </span><span class="identifier">len22</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-fl.html">Back to 'FileIO Template'</a></li><li><a href="S-tbl.html">Continue with 'Tables Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>
</main>
</body>
</html>