mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-16 05:30:59 +00:00
deploy
This commit is contained in:
@@ -1740,18 +1740,19 @@
|
||||
|
||||
|
||||
<h1 id="111">11.1. 排序简介<a class="headerlink" href="#111" title="Permanent link">¶</a></h1>
|
||||
<p>「排序算法 Sorting Algorithm」使得列表中的所有元素按照从小到大的顺序排列。</p>
|
||||
<p>「排序算法 Sorting Algorithm」使列表中的所有元素按照升序排列。</p>
|
||||
<ul>
|
||||
<li>待排序的列表的 <strong>元素类型</strong> 可以是整数、浮点数、字符、或字符串;</li>
|
||||
<li>排序算法可以根据需要设定 <strong>判断规则</strong>,例如数字大小、字符 ASCII 码顺序、自定义规则;</li>
|
||||
<li>待排序列表的元素类型可以是整数、浮点数、字符或字符串等;</li>
|
||||
<li>排序算法可根据需求设定判断规则,如数字大小、字符 ASCII 码顺序或自定义规则;</li>
|
||||
</ul>
|
||||
<p><img alt="排序中不同的元素类型和判断规则" src="../intro_to_sort.assets/sorting_examples.png" /></p>
|
||||
<p align="center"> Fig. 排序中不同的元素类型和判断规则 </p>
|
||||
|
||||
<h2 id="1111">11.1.1. 评价维度<a class="headerlink" href="#1111" title="Permanent link">¶</a></h2>
|
||||
<p><strong>运行效率</strong>:我们希望排序算法的时间复杂度尽可能低,并且总体操作数量更少(即时间复杂度中的常数项更低)。在大数据量下,运行效率尤为重要。</p>
|
||||
<p><strong>就地性</strong>:顾名思义,「原地排序」直接在原数组上操作实现排序,而不用借助额外辅助数组,节约内存;并且一般情况下,原地排序的数据搬运操作较少,运行速度也更快。</p>
|
||||
<p><strong>稳定性</strong>:「稳定排序」在完成排序后,相等元素在数组中的相对顺序 <strong>不会发生改变</strong>。假设我们有一个存储学生信息的表格,第 1, 2 列分别是姓名和年龄。那么在以下示例中,「非稳定排序」会导致输入数据的有序性丢失。稳定性是排序算法很好的特性,<strong>在多级排序中是必须的</strong>。</p>
|
||||
<p><strong>运行效率</strong>:我们期望排序算法的时间复杂度尽量低,且总体操作数量较少(即时间复杂度中的常数项降低)。对于大数据量情况,运行效率显得尤为重要。</p>
|
||||
<p><strong>就地性</strong>:顾名思义,「原地排序」通过在原数组上直接操作实现排序,无需借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。</p>
|
||||
<p><strong>稳定性</strong>:「稳定排序」在完成排序后,相等元素在数组中的相对顺序不发生改变。稳定排序是优良特性,也是多级排序场景的必要条件。</p>
|
||||
<p>假设我们有一个存储学生信息的表格,第 1, 2 列分别是姓名和年龄。在这种情况下,「非稳定排序」可能导致输入数据的有序性丧失。</p>
|
||||
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># 输入数据是按照姓名排序好的</span>
|
||||
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="c1"># (name, age)</span>
|
||||
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="o">(</span><span class="s1">'A'</span>,<span class="w"> </span><span class="m">19</span><span class="o">)</span>
|
||||
@@ -1769,11 +1770,12 @@
|
||||
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="w"> </span><span class="o">(</span><span class="s1">'C'</span>,<span class="w"> </span><span class="m">21</span><span class="o">)</span>
|
||||
<a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="w"> </span><span class="o">(</span><span class="s1">'E'</span>,<span class="w"> </span><span class="m">23</span><span class="o">)</span>
|
||||
</code></pre></div>
|
||||
<p><strong>自适应性</strong>:「自适应排序」的时间复杂度受输入数据影响,即最佳、最差、平均时间复杂度不全部相等。自适应性也要分情况对待,若最差时间复杂度差于平均时间复杂度,代表排序算法会在某些数据下发生劣化,因此是负面性质;而若最佳时间复杂度优于平均时间复杂度,则是正面性质。</p>
|
||||
<p><strong>是否基于比较</strong>:「比较排序」是根据比较算子(<span class="arithmatex">\(<\)</span> , <span class="arithmatex">\(=\)</span> , <span class="arithmatex">\(>\)</span>)来判断元素的相对顺序,进而排序整个数组,理论最优时间复杂度为 <span class="arithmatex">\(O(n \log n)\)</span> 。「非比较排序」不采用,时间复杂度可以达到 <span class="arithmatex">\(O(n)\)</span> ,但通用性相对较差。</p>
|
||||
<p><strong>自适应性</strong>:「自适应排序」的时间复杂度会受输入数据的影响,即最佳、最差、平均时间复杂度并不完全相等。</p>
|
||||
<p>自适应性需要根据具体情况来评估。如果最差时间复杂度差于平均时间复杂度,说明排序算法在某些数据下性能可能劣化,因此被视为负面属性;而如果最佳时间复杂度优于平均时间复杂度,则被视为正面属性。</p>
|
||||
<p><strong>是否基于比较</strong>:「基于比较的排序」依赖于比较运算符(<span class="arithmatex">\(<\)</span> , <span class="arithmatex">\(=\)</span> , <span class="arithmatex">\(>\)</span>)来判断元素的相对顺序,从而排序整个数组,理论最优时间复杂度为 <span class="arithmatex">\(O(n \log n)\)</span> 。而「非比较排序」不使用比较运算符,时间复杂度可达 <span class="arithmatex">\(O(n)\)</span> ,但其通用性相对较差。</p>
|
||||
<h2 id="1112">11.1.2. 理想排序算法<a class="headerlink" href="#1112" title="Permanent link">¶</a></h2>
|
||||
<p><strong>运行快、原地、稳定、正向自适应、通用性好</strong>。显然,<strong>目前没有发现具备以上所有特性的排序算法</strong>,排序算法的选型使用取决于具体的数据特点与问题特征。</p>
|
||||
<p>接下来,我们将一起学习各种排序算法,并基于以上评价维度展开分析各个排序算法的优缺点。</p>
|
||||
<p><strong>运行快、原地、稳定、正向自适应、通用性好</strong>。显然,迄今为止尚未发现兼具以上所有特性的排序算法。因此,在选择排序算法时,需要根据具体的数据特点和问题需求来决定。</p>
|
||||
<p>接下来,我们将共同学习各种排序算法,并基于上述评价维度对各个排序算法的优缺点进行分析。</p>
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user