This commit is contained in:
krahets
2023-08-29 20:57:26 +08:00
parent 6ae6c480e0
commit 8c4d24795c
32 changed files with 574 additions and 278 deletions
+1 -4
View File
@@ -3820,11 +3820,8 @@
</div>
</div>
</div>
<div class="admonition question">
<p class="admonition-title">桶排序的适用场景是什么?</p>
<p>桶排序适用于处理体量很大的数据。例如,输入数据包含 100 万个元素,由于空间限制,系统内存无法一次性加载所有数据。此时,可以将数据分成 1000 个桶,然后分别对每个桶进行排序,最后将结果合并。</p>
</div>
<h2 id="1182">11.8.2 &nbsp; 算法特性<a class="headerlink" href="#1182" title="Permanent link">&para;</a></h2>
<p>桶排序适用于处理体量很大的数据。例如,输入数据包含 100 万个元素,由于空间限制,系统内存无法一次性加载所有数据。此时,可以将数据分成 1000 个桶,然后分别对每个桶进行排序,最后将结果合并。</p>
<ul>
<li><strong>时间复杂度 <span class="arithmatex">\(O(n + k)\)</span></strong> :假设元素在各个桶内平均分布,那么每个桶内的元素数量为 <span class="arithmatex">\(\frac{n}{k}\)</span> 。假设排序单个桶使用 <span class="arithmatex">\(O(\frac{n}{k} \log\frac{n}{k})\)</span> 时间,则排序所有桶使用 <span class="arithmatex">\(O(n \log\frac{n}{k})\)</span> 时间。<strong>当桶数量 <span class="arithmatex">\(k\)</span> 比较大时,时间复杂度则趋向于 <span class="arithmatex">\(O(n)\)</span></strong> 。合并结果时需要遍历所有桶和元素,花费 <span class="arithmatex">\(O(n + k)\)</span> 时间。</li>
<li><strong>自适应排序</strong>:在最坏情况下,所有数据被分配到一个桶中,且排序该桶使用 <span class="arithmatex">\(O(n^2)\)</span> 时间。</li>
+1 -1
View File
@@ -3465,7 +3465,7 @@
<p align="center"> 图 11-10 &nbsp; 归并排序的划分与合并阶段 </p>
<h2 id="1161">11.6.1 &nbsp; 算法流程<a class="headerlink" href="#1161" title="Permanent link">&para;</a></h2>
<p>如图 11-11 所示,“划分阶段”从顶至底递归地将数组从中点切为两个子数组。</p>
<p>如图 11-11 所示,“划分阶段”从顶至底递归地将数组从中点切为两个子数组。</p>
<ol>
<li>计算数组中点 <code>mid</code> ,递归划分左子数组(区间 <code>[left, mid]</code> )和右子数组(区间 <code>[mid + 1, right]</code> )。</li>
<li>递归执行步骤 <code>1.</code> ,直至子数组区间长度为 1 时,终止递归划分。</li>
+20 -5
View File
@@ -2313,8 +2313,15 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#11111-q-a" class="md-nav__link">
11.11.1 &nbsp; Q &amp; A
<a href="#1" class="md-nav__link">
1. &nbsp; 重点回顾
</a>
</li>
<li class="md-nav__item">
<a href="#2-q-a" class="md-nav__link">
2. &nbsp; Q &amp; A
</a>
</li>
@@ -3398,8 +3405,15 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#11111-q-a" class="md-nav__link">
11.11.1 &nbsp; Q &amp; A
<a href="#1" class="md-nav__link">
1. &nbsp; 重点回顾
</a>
</li>
<li class="md-nav__item">
<a href="#2-q-a" class="md-nav__link">
2. &nbsp; Q &amp; A
</a>
</li>
@@ -3428,6 +3442,7 @@
<h1 id="1111">11.11 &nbsp; 小结<a class="headerlink" href="#1111" title="Permanent link">&para;</a></h1>
<h3 id="1">1. &nbsp; 重点回顾<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<ul>
<li>冒泡排序通过交换相邻元素来实现排序。通过添加一个标志位来实现提前返回,我们可以将冒泡排序的最佳时间复杂度优化到 <span class="arithmatex">\(O(n)\)</span></li>
<li>插入排序每轮将未排序区间内的元素插入到已排序区间的正确位置,从而完成排序。虽然插入排序的时间复杂度为 <span class="arithmatex">\(O(n^2)\)</span> ,但由于单元操作相对较少,它在小数据量的排序任务中非常受欢迎。</li>
@@ -3442,7 +3457,7 @@
<p><img alt="排序算法对比" src="../summary.assets/sorting_algorithms_comparison.png" /></p>
<p align="center"> 图 11-19 &nbsp; 排序算法对比 </p>
<h2 id="11111-q-a">11.11.1 &nbsp; Q &amp; A<a class="headerlink" href="#11111-q-a" title="Permanent link">&para;</a></h2>
<h3 id="2-q-a">2. &nbsp; Q &amp; A<a class="headerlink" href="#2-q-a" title="Permanent link">&para;</a></h3>
<div class="admonition question">
<p class="admonition-title">排序算法稳定性在什么情况下是必须的?</p>
<p>在现实中,我们有可能是在对象的某个属性上进行排序。例如,学生有姓名和身高两个属性,我们希望实现一个多级排序/</p>