mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-19 06:50:59 +00:00
deploy
This commit is contained in:
@@ -4674,7 +4674,7 @@
|
||||
|
||||
<!-- Page content -->
|
||||
<h1 id="118">11.8 桶排序<a class="headerlink" href="#118" title="Permanent link">¶</a></h1>
|
||||
<p>前述幾種排序演算法都屬於“基於比較的排序演算法”,它們透過比較元素間的大小來實現排序。此類排序演算法的時間複雜度無法超越 <span class="arithmatex">\(O(n \log n)\)</span> 。接下來,我們將探討幾種“非比較排序演算法”,它們的時間複雜度可以達到線性階。</p>
|
||||
<p>前述幾種排序演算法都屬於“基於比較的排序演算法”,它們透過比較元素間的大小來實現排序。此類排序演算法在最壞情況下的時間複雜度下界為 <span class="arithmatex">\(\Omega(n \log n)\)</span> 。接下來,我們將探討幾種“非比較排序演算法”,它們的時間複雜度可以達到線性階。</p>
|
||||
<p><u>桶排序(bucket sort)</u>是分治策略的一個典型應用。它透過設定一些具有大小順序的桶,每個桶對應一個數據範圍,將資料平均分配到各個桶中;然後,在每個桶內部分別執行排序;最終按照桶的順序將所有資料合併。</p>
|
||||
<h2 id="1181">11.8.1 演算法流程<a class="headerlink" href="#1181" title="Permanent link">¶</a></h2>
|
||||
<p>考慮一個長度為 <span class="arithmatex">\(n\)</span> 的陣列,其元素是範圍 <span class="arithmatex">\([0, 1)\)</span> 內的浮點數。桶排序的流程如圖 11-13 所示。</p>
|
||||
|
||||
@@ -4937,7 +4937,7 @@
|
||||
</details>
|
||||
<h2 id="1121">11.2.1 演算法特性<a class="headerlink" href="#1121" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
<li><strong>時間複雜度為 <span class="arithmatex">\(O(n^2)\)</span>、非自適應排序</strong>:外迴圈共 <span class="arithmatex">\(n - 1\)</span> 輪,第一輪的未排序區間長度為 <span class="arithmatex">\(n\)</span> ,最後一輪的未排序區間長度為 <span class="arithmatex">\(2\)</span> ,即各輪外迴圈分別包含 <span class="arithmatex">\(n\)</span>、<span class="arithmatex">\(n - 1\)</span>、<span class="arithmatex">\(\dots\)</span>、<span class="arithmatex">\(3\)</span>、<span class="arithmatex">\(2\)</span> 輪內迴圈,求和為 <span class="arithmatex">\(\frac{(n - 1)(n + 2)}{2}\)</span> 。</li>
|
||||
<li><strong>時間複雜度為 <span class="arithmatex">\(O(n^2)\)</span>、非自適應排序</strong>:外迴圈共 <span class="arithmatex">\(n - 1\)</span> 輪,第一輪內迴圈執行 <span class="arithmatex">\(n - 1\)</span> 次,最後一輪執行 <span class="arithmatex">\(1\)</span> 次,即各輪內迴圈分別執行 <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">\(\frac{n(n - 1)}{2}\)</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>:如圖 11-3 所示,元素 <code>nums[i]</code> 有可能被交換至與其相等的元素的右邊,導致兩者的相對順序發生改變。</li>
|
||||
</ul>
|
||||
|
||||
@@ -4680,7 +4680,7 @@
|
||||
<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>:<u>自適應排序</u>能夠利用輸入資料已有的順序資訊來減少計算量,達到更優的時間效率。自適應排序演算法的最佳時間複雜度通常優於平均時間複雜度。</p>
|
||||
<p><strong>是否基於比較</strong>:<u>基於比較的排序</u>依賴比較運算子(<span class="arithmatex">\(<\)</span>、<span class="arithmatex">\(=\)</span>、<span class="arithmatex">\(>\)</span>)來判斷元素的相對順序,從而排序整個陣列,理論最優時間複雜度為 <span class="arithmatex">\(O(n \log n)\)</span> 。而<u>非比較排序</u>不使用比較運算子,時間複雜度可達 <span class="arithmatex">\(O(n)\)</span> ,但其通用性相對較差。</p>
|
||||
<p><strong>是否基於比較</strong>:<u>基於比較的排序</u>依賴比較運算子(<span class="arithmatex">\(<\)</span>、<span class="arithmatex">\(=\)</span>、<span class="arithmatex">\(>\)</span>)來判斷元素的相對順序,從而排序整個陣列,其最壞時間複雜度的下界為 <span class="arithmatex">\(\Omega(n \log n)\)</span> 。而<u>非比較排序</u>不使用比較運算子,時間複雜度可達 <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>。顯然,迄今為止尚未發現兼具以上所有特性的排序演算法。因此,在選擇排序演算法時,需要根據具體的資料特點和問題需求來決定。</p>
|
||||
<p>接下來,我們將共同學習各種排序演算法,並基於上述評價維度對各個排序演算法的優缺點進行分析。</p>
|
||||
|
||||
Reference in New Issue
Block a user