mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-24 12:06:07 +00:00
deploy
This commit is contained in:
@@ -3390,17 +3390,17 @@
|
||||
<h1 id="116">11.6. 归并排序<a class="headerlink" href="#116" title="Permanent link">¶</a></h1>
|
||||
<p>「归并排序 Merge Sort」基于分治思想实现排序,包含“划分”和“合并”两个阶段:</p>
|
||||
<ol>
|
||||
<li><strong>划分阶段</strong>:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题;</li>
|
||||
<li><strong>合并阶段</strong>:当子数组长度为 1 时终止划分,开始合并,持续地将左右两个较短的有序数组合并为一个较长的有序数组,直至结束;</li>
|
||||
<li><strong>划分阶段</strong>:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题。</li>
|
||||
<li><strong>合并阶段</strong>:当子数组长度为 1 时终止划分,开始合并,持续地将左右两个较短的有序数组合并为一个较长的有序数组,直至结束。</li>
|
||||
</ol>
|
||||
<p><img alt="归并排序的划分与合并阶段" src="../merge_sort.assets/merge_sort_overview.png" /></p>
|
||||
<p align="center"> Fig. 归并排序的划分与合并阶段 </p>
|
||||
|
||||
<h2 id="1161">11.6.1. 算法流程<a class="headerlink" href="#1161" title="Permanent link">¶</a></h2>
|
||||
<p>“划分阶段”从顶至底递归地将数组从中点切为两个子数组,直至长度为 1 ;</p>
|
||||
<p>“划分阶段”从顶至底递归地将数组从中点切为两个子数组:</p>
|
||||
<ol>
|
||||
<li>计算数组中点 <code>mid</code> ,递归划分左子数组(区间 <code>[left, mid]</code> )和右子数组(区间 <code>[mid + 1, right]</code> );</li>
|
||||
<li>递归执行步骤 <code>1.</code> ,直至子数组区间长度为 1 时,终止递归划分;</li>
|
||||
<li>计算数组中点 <code>mid</code> ,递归划分左子数组(区间 <code>[left, mid]</code> )和右子数组(区间 <code>[mid + 1, right]</code> )。</li>
|
||||
<li>递归执行步骤 <code>1.</code> ,直至子数组区间长度为 1 时,终止递归划分。</li>
|
||||
</ol>
|
||||
<p>“合并阶段”从底至顶地将左子数组和右子数组合并为一个有序数组。需要注意的是,从长度为 1 的子数组开始合并,合并阶段中的每个子数组都是有序的。</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="1:10"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><input id="__tabbed_1_9" name="__tabbed_1" type="radio" /><input id="__tabbed_1_10" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1"><1></label><label for="__tabbed_1_2"><2></label><label for="__tabbed_1_3"><3></label><label for="__tabbed_1_4"><4></label><label for="__tabbed_1_5"><5></label><label for="__tabbed_1_6"><6></label><label for="__tabbed_1_7"><7></label><label for="__tabbed_1_8"><8></label><label for="__tabbed_1_9"><9></label><label for="__tabbed_1_10"><10></label></div>
|
||||
@@ -3952,7 +3952,7 @@
|
||||
<p>归并排序在排序链表时具有显著优势,空间复杂度可以优化至 <span class="arithmatex">\(O(1)\)</span> ,原因如下:</p>
|
||||
<ul>
|
||||
<li>由于链表仅需改变指针就可实现节点的增删操作,因此合并阶段(将两个短有序链表合并为一个长有序链表)无需创建辅助链表。</li>
|
||||
<li>通过使用“迭代划分”替代“递归划分”,可省去递归使用的栈帧空间;</li>
|
||||
<li>通过使用“迭代划分”替代“递归划分”,可省去递归使用的栈帧空间。</li>
|
||||
</ul>
|
||||
<p>具体实现细节比较复杂,有兴趣的同学可以查阅相关资料进行学习。</p>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user