This commit is contained in:
krahets
2023-12-28 17:18:44 +08:00
parent 5e0d7327db
commit b8a5bd790b
114 changed files with 860 additions and 863 deletions
+6 -6
View File
@@ -1719,7 +1719,7 @@
<span class="md-ellipsis">
8.3 &nbsp; Top-K 问题
8.3 &nbsp; Top-k 问题
</span>
@@ -2326,7 +2326,7 @@
<li class="md-nav__item">
<a href="#1143" class="md-nav__link">
<span class="md-ellipsis">
11.4.3 &nbsp; 插入排序优势
11.4.3 &nbsp; 插入排序优势
</span>
</a>
@@ -3490,7 +3490,7 @@
<li class="md-nav__item">
<a href="#1143" class="md-nav__link">
<span class="md-ellipsis">
11.4.3 &nbsp; 插入排序优势
11.4.3 &nbsp; 插入排序优势
</span>
</a>
@@ -3754,11 +3754,11 @@
</div>
<h2 id="1142">11.4.2 &nbsp; 算法特性<a class="headerlink" href="#1142" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>时间复杂度 <span class="arithmatex">\(O(n^2)\)</span>、自适应排序</strong>:在最差情况下,每次插入操作分别需要循环 <span class="arithmatex">\(n - 1\)</span><span class="arithmatex">\(n-2\)</span><span class="arithmatex">\(\dots\)</span><span class="arithmatex">\(2\)</span><span class="arithmatex">\(1\)</span> 次,求和得到 <span class="arithmatex">\((n - 1) n / 2\)</span> ,因此时间复杂度为 <span class="arithmatex">\(O(n^2)\)</span> 。在遇到有序数据时,插入操作会提前终止。当输入数组完全有序时,插入排序达到最佳时间复杂度 <span class="arithmatex">\(O(n)\)</span></li>
<li><strong>空间复杂度 <span class="arithmatex">\(O(1)\)</span>、原地排序</strong>:指针 <span class="arithmatex">\(i\)</span><span class="arithmatex">\(j\)</span> 使用常数大小的额外空间。</li>
<li><strong>时间复杂度 <span class="arithmatex">\(O(n^2)\)</span>、自适应排序</strong>:在最差情况下,每次插入操作分别需要循环 <span class="arithmatex">\(n - 1\)</span><span class="arithmatex">\(n-2\)</span><span class="arithmatex">\(\dots\)</span><span class="arithmatex">\(2\)</span><span class="arithmatex">\(1\)</span> 次,求和得到 <span class="arithmatex">\((n - 1) n / 2\)</span> ,因此时间复杂度为 <span class="arithmatex">\(O(n^2)\)</span> 。在遇到有序数据时,插入操作会提前终止。当输入数组完全有序时,插入排序达到最佳时间复杂度 <span class="arithmatex">\(O(n)\)</span></li>
<li><strong>空间复杂度 <span class="arithmatex">\(O(1)\)</span>、原地排序</strong>:指针 <span class="arithmatex">\(i\)</span><span class="arithmatex">\(j\)</span> 使用常数大小的额外空间。</li>
<li><strong>稳定排序</strong>:在插入操作过程中,我们会将元素插入到相等元素的右侧,不会改变它们的顺序。</li>
</ul>
<h2 id="1143">11.4.3 &nbsp; 插入排序优势<a class="headerlink" href="#1143" title="Permanent link">&para;</a></h2>
<h2 id="1143">11.4.3 &nbsp; 插入排序优势<a class="headerlink" href="#1143" title="Permanent link">&para;</a></h2>
<p>插入排序的时间复杂度为 <span class="arithmatex">\(O(n^2)\)</span> ,而我们即将学习的快速排序的时间复杂度为 <span class="arithmatex">\(O(n \log n)\)</span> 。尽管插入排序的时间复杂度更高,<strong>但在数据量较小的情况下,插入排序通常更快</strong></p>
<p>这个结论与线性查找和二分查找的适用情况的结论类似。快速排序这类 <span class="arithmatex">\(O(n \log n)\)</span> 的算法属于基于分治策略的排序算法,往往包含更多单元计算操作。而在数据量较小时,<span class="arithmatex">\(n^2\)</span><span class="arithmatex">\(n \log n\)</span> 的数值比较接近,复杂度不占主导地位;每轮中的单元操作数量起到决定性作用。</p>
<p>实际上,许多编程语言(例如 Java)的内置排序函数采用了插入排序,大致思路为:对于长数组,采用基于分治策略的排序算法,例如快速排序;对于短数组,直接使用插入排序。</p>