版权声明:本文为博主(1194585271@qq.com)原创文章,未经博主允许不得转载。 <a class="copy-right-url" href=" https://blog.csdn.net/z_feng12489/article/details/88863262"> https://blog.csdn.net/z_feng12489/article/details/88863262</a>
</div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<div id="content_views" class="markdown_views prism-tomorrow-night">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p></p><div class="toc"><h3><a name="t0"></a>文章目录</h3><ul><li><a href="#_1" rel="nofollow" data-token="ea6c7c32165ce8165eaef2579e2db65f" target="_self">基本思想</a></li><li><a href="#python__15" rel="nofollow" data-token="4aea2877b4e6e73803d2e293be2369b7" target="_self">python 实现</a></li><li><a href="#_35" rel="nofollow" data-token="441b12864ff6930573f53eeca4dd014e" target="_self">程序结果</a></li><li><a href="#_44" rel="nofollow" data-token="55b7973b4005dda8168f5f34e342f425" target="_self">时空复杂度分析</a></li><li><a href="#_56" rel="nofollow" data-token="749bba42179ac5218a48b600c932b9eb" target="_self">稳定性</a></li></ul></div><p></p>
基本思想
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为
l
o
g
2
n
l
o
g
2
n
l
o
g
2
n
log2nlog2n log2n
log2nlog2nlog2na[low...high]。
python 实现
class Sort: def merge_sort(self,data): if len(data)<=1: return data
middle <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token operator">//</span><span class="token number">2</span> left<span class="token punctuation">,</span> right <span class="token operator">=</span> self<span class="token punctuation">.</span>merge_sort<span class="token punctuation">(</span>data<span class="token punctuation">[</span><span class="token punctuation">:</span>middle<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>merge_sort<span class="token punctuation">(</span>data<span class="token punctuation">[</span>middle<span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">return</span> self<span class="token punctuation">.</span>merge<span class="token punctuation">(</span>left<span class="token punctuation">,</span>right<span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">merge</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>left<span class="token punctuation">,</span>right<span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token comment">#治</span> result <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token keyword">while</span> left <span class="token operator">and</span> right<span class="token punctuation">:</span> result<span class="token punctuation">.</span>append<span class="token punctuation">(</span>left<span class="token punctuation">.</span>pop<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span> left<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">></span>right<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token keyword">else</span> result<span class="token punctuation">.</span>append<span class="token punctuation">(</span>right<span class="token punctuation">.</span>pop<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> result<span class="token punctuation">.</span>extend<span class="token punctuation">(</span>left<span class="token punctuation">)</span> <span class="token keyword">if</span> left <span class="token keyword">else</span> result<span class="token punctuation">.</span>extend<span class="token punctuation">(</span>right<span class="token punctuation">)</span> <span class="token keyword">return</span> result
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
程序结果
if __name__=='__main__':
test = Sort()
res = test.merge_sort([5,8,1,6,7,4,9,9])
res = [1, 4, 5, 6, 7, 8, 9, 9]
- 1
- 2
- 3
- 4
时空复杂度分析
-
归并排序时间复杂度
归并排序的时间复杂度是 O ( N ∗ l g N ) O ( N ∗ l g N ) O ( N ∗ l g N ) O(N∗lgN)O(N∗lgN) O(N*lgN) O(N∗lgN)O(N∗lgN)O(N∗lgN)a[j] 前面。则这个排序算法是稳定的!</div> <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet"> </div> </article>