This commit is contained in:
krahets
2026-08-18 03:09:26 +08:00
parent 0375f25b66
commit fde23f369e
158 changed files with 312 additions and 282 deletions
+1 -1
View File
@@ -4674,7 +4674,7 @@
<!-- Page content -->
<h1 id="118">11.8 &nbsp; バケットソート<a class="headerlink" href="#118" title="Permanent link">&para;</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 &nbsp; アルゴリズムの流れ<a class="headerlink" href="#1181" title="Permanent link">&para;</a></h2>
<p>長さ <span class="arithmatex">\(n\)</span> の配列を考え、その要素は範囲 <span class="arithmatex">\([0, 1)\)</span> の浮動小数点数であるとします。バケットソートの流れを以下の図に示します。</p>
+1 -1
View File
@@ -4937,7 +4937,7 @@
</details>
<h2 id="1121">11.2.1 &nbsp; アルゴリズムの特徴<a class="headerlink" href="#1121" 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\)</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>:次の図のように、要素 <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">&#39;E&#39;</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">\(&lt;\)</span><span class="arithmatex">\(=\)</span><span class="arithmatex">\(&gt;\)</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">\(&lt;\)</span><span class="arithmatex">\(=\)</span><span class="arithmatex">\(&gt;\)</span>)に依存して要素の相対順序を判定し、それによって配列全体をソートします。の最時間計算量の下界<span class="arithmatex">\(\Omega(n \log n)\)</span> です。一方、<u>非比較ソート</u>は比較演算子を使用せず、時間計算量は <span class="arithmatex">\(O(n)\)</span> に達しますが、汎用性は相対的に低くなります。</p>
<h2 id="1112">11.1.2 &nbsp; 理想的なソートアルゴリズム<a class="headerlink" href="#1112" title="Permanent link">&para;</a></h2>
<p><strong>高速、インプレース、安定、適応的、高い汎用性</strong>。明らかに、これまでのところ、以上のすべての特性を兼ね備えたソートアルゴリズムはまだ見つかっていません。そのため、ソートアルゴリズムを選択する際には、具体的なデータの特徴と問題の要件に応じて判断する必要があります。</p>
<p>次に、さまざまなソートアルゴリズムを一緒に学び、上記の評価軸に基づいて各ソートアルゴリズムの長所と短所を分析していきます。</p>