Divide and Conquer.(Merge Sort) by sixleaves

本文详细介绍了Merge排序算法的动机、伪代码实现及运行时间分析,通过实例展示了如何使用Merge排序对数组进行升序排序,并深入探讨了其复杂度与效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!doctype html>



algo-C1-Introduction

Merge Sort:

一.Motivation and Example

why study merge sort?

  • Good introduction to divide & conquer
  • Calibrate your preparation
  • Motivates guiding principles for algorithm analysis(worst-case and asymptotic analysis)
  • Analysis generalizes to “Master Method"

The Sorting Problem

Input: array of n numbers, unsorted. (5 4 1 8 7 2 6 3)

Output: same numbers, sorted in increasing order (1 … 8)

Example:

QQ20150811-1

二.Pseudocode:

  • recursively sort 1st half of input array
  • recursively sort 2nd half of input array
  • merge two sorted sublists into one[ ignores base cases]

Pseudocode for Merge:

QQ20150811-2

Merge Sort Running Time:

Key Question: running time of MergeSort on array of n numbers?

[Running time ~ #of mines of code executed ]

Running Time of Merge:

running time of merge on array of m numbers is <= 4m + 2 <= 6m(since m >= 1)

Running Time of Merge Sort

Claim: MergeSort requires <=

6nlog2n+6n

operations for sort n numbers

Recall:

log2n

of times you divide by 2 until you get a number that drops below one

So if you plug in 32 you got to divide five time by two get down to one.

三.Analysis

Claim:

For every Input array of n numbers, Merge Sort produces a sorted output array and uses at most 6nlog_2n + 6n operations.

Proof of calim (assuming n = power of 2):

Question1:

how many levels does this recursion tree have.===>

beacause: {level0, level1……. level(log2n)} === > (log_2n - 0) + 1 ===>

log2n+1

Question2

at each level j = 0,1 ,2 , log_2n, there are 2^j subproblems, each of size n / 2^j.

第二个的原因很简单, 这颗递归树的第j层的子问题有 2^j 个, 例如第0层是1个, 第1层是两个, 由此类推, 所以每个的大小都是n / 2^j.

Proof of claim

第j层总的合并程序中所含有的指令次数是 <= 2 ^j * 6(n / 2^j) = 6n.也就是所每一层的合并程序内部所做的指令次数都是固定的, 为6n次, 所以对于这课共有log2n + 1个层的数, 总的操作次数为6n( log2n + 1) = 6nlog_2n + 6n.

转载于:https://www.cnblogs.com/objectc/p/4722335.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
### 分治算法的时间复杂度 分治算法是一种重要的算法设计技术,其核心在于将一个问题分解成多个较小规模的相同问题,分别求解后再合并各个子问题的结果得到原始问题的答案。对于这类算法而言,时间复杂度主要取决于三个因素: - **分解操作的成本**:即将原问题划分为更小子问题所需的工作量。 - **解决各子问题所需的总成本**:这通常是递归调用本身的时间开销。 - **组合子问题解决方案的成本**:即如何有效地把所有子问题的解答汇总起来形成最终答案。 #### 计算方法 为了计算分治算法的时间复杂度,可以利用主定理(Master Theorem),它提供了一种简便的方法来估计形如 \(T(n)=aT(\frac{n}{b})+f(n)\) 的递推关系式的渐近界[^3]。这里, - \(n\) 表示输入大小; - \(a \geq 1\) 和 \(b > 1\) 是常数; - \(f(n)\) 描述了除递归外其他部分工作量的增长速度。 当应用到具体的例子时,比如快速排序,如果每次都能均匀分割,则有 \(a=2\),\(b=2\),而额外处理(比较和交换元素)大致线性增长,因此 \(f(n)=O(n)\),从而得出平均情况下快速排序的时间复杂度为 \(O(n\log n)\)[^4]。 #### 示例 考虑经典的归并排序作为实例展示分治算法及其时间复杂度分析过程: ```java public class MergeSort { public static void merge(int[] array, int left, int mid, int right){ // 合并两个已排序序列... } public static void sort(int[] array, int left, int right){ if (left < right){ int mid = (left + right)/2; // 对左半边进行递归排序 sort(array, left, mid); // 对右半边进行递归排序 sort(array, mid+1, right); // 将两部分有序数组合并在一起 merge(array, left, mid, right); } } } ``` 在这个实现中,`sort()` 函数负责递归地拆分子数组直到不能再分为止,之后再由 `merge()` 来完成实际的数据整理任务。由于每层递归都会使待处理区间减半,并且每一层都需要遍历整个列表来进行合并操作,故此算法的整体时间复杂度同样遵循 \(O(n\log n)\) 的规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值