<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Python排序算法——归并排序</title>
<link rel="stylesheet" href="https://stackedit.io/style.css" />
</head>
<body class="stackedit">
<div class="stackedit__html"><p>归并排序(Merge Sort)是一种经典的分治算法,其基本思想是将待排序序列分成两个长度相等(或大致相等)的子序列,分别对这两个子序列进行递归排序,然后将已排序的子序列合并成一个有序序列。</p>
<p>归并排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。它的性能比较稳定,不受输入数据状态的影响,因此无论待排序序列是否已经有序,归并排序的时间复杂度始终保持在O(nlogn)。</p>
<p>以下是归并排序的Python实现:</p>
<pre><code class="prism language-python"><span class="token keyword">def</span> <span class="token function">merge_sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> <span class="token builtin">len</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token operator"><=</span> <span class="token number">1</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> arr
mid <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token operator">//</span> <span class="token number">2</span>
left <span class="token operator">=</span> merge_sort<span class="token punctuation">(</span>arr<span class="token punctuation">[</span><span class="token punctuation">:</span>mid<span class="token punctuation">]</span><span class="token punctuation">)</span>
right <span class="token operator">=</span> merge_sort<span class="token punctuation">(</span>arr<span class="token punctuation">[</span>mid<span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">return</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>left<span class="token punctuation">,</span> right<span class="token punctuation">)</span><span class="token punctuation">:</span>
result <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
left_index<span class="token punctuation">,</span> right_index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span>
<span class="token keyword">while</span> left_index <span class="token operator"><</span> <span class="token builtin">len</span><span class="token punctuation">(</span>left<span class="token punctuation">)</span> <span class="token keyword">and</span> right_index <span class="token operator"><</span> <span class="token builtin">len</span><span class="token punctuation">(</span>right<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> left<span class="token punctuation">[</span>left_index<span class="token punctuation">]</span> <span class="token operator"><</span> right<span class="token punctuation">[</span>right_index<span class="token punctuation">]</span><span class="token punctuation">:</span>
result<span class="token punctuation">.</span>append<span class="token punctuation">(</span>left<span class="token punctuation">[</span>left_index<span class="token punctuation">]</span><span class="token punctuation">)</span>
left_index <span class="token operator">+=</span> <span class="token number">1</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
result<span class="token punctuation">.</span>append<span class="token punctuation">(</span>right<span class="token punctuation">[</span>right_index<span class="token punctuation">]</span><span class="token punctuation">)</span>
right_index <span class="token operator">+=</span> <span class="token number">1</span>
result<span class="token punctuation">.</span>extend<span class="token punctuation">(</span>left<span class="token punctuation">[</span>left_index<span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
result<span class="token punctuation">.</span>extend<span class="token punctuation">(</span>right<span class="token punctuation">[</span>right_index<span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> result
</code></pre>
<p>归并排序的性能比较稳定,并且不受输入数据状态的影响。它的<strong>时间复杂度为O(nlogn)</strong>,其中n是待排序序列的长度。归并排序的<strong>空间复杂度为O(n)</strong>,因为它需要额外的空间来存储已排序的子序列。</p>
<p>尽管归并排序在最坏情况下和平均情况下的时间复杂度均为O(nlogn),但它的<em>实际执行时间通常会比快速排序稍慢</em>,因为归并排序需要更多的递归调用和合并操作。然而,归并排序具有稳定性和可预测性,因此在某些场景下,特别是对于<strong>对稳定性要求较高的情况</strong>,归并排序可能是更好的选择。</p>
</div>
</body>
</html>
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Python排序算法详解.zip (5个子文件)
Python排序算法——快速排序.html 4KB
Python排序算法——插入排序.html 3KB
Python排序算法——归并排序.html 6KB
Python排序算法——冒泡排序.html 3KB
Python排序算法——选择排序.html 3KB
共 5 条
- 1
资源评论
SmiledrinkCat
- 粉丝: 1362
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功