数据结构定义和算法--排序--归并排序

算法原理

先把数据从中间分为前后两部分,然后对前后两部分分别排序,最后将排好序的合并到一起。

如何实现

  1. 递推公式:merge_sort(p, r) = merge(merge_sort(p, q), merge_sort(q+1, r))
  2. 终止条件:p >= r

 

算法稳定性

归并算法是否稳定,关键在于merge函数合并时的代码。在合并过程冲如果A[p, q]和A[q+1, r]中有值相同的元素,将A[p, q]中的元素放在temp前面,就可以保证算法的稳定性。

时间复杂度

  1. 分析归并算法时间复杂度就是分析递归代码的时间复杂度:T(a) = T(b) + T(c) + K(a问题可以分解为b和c子问题,K为合并所需用时间);
  2. 具体计算:T(1) = C; T(n) = 2 * T(n/2) + n = 2 * (2 * T(n/4) + n/2) + n = 4 * T(n/4) + 2 * n = 8 * T(n/8) + 3 * n = 16 * T(n/16) + 4 * n = ...... =2^k * T(n/(2^k)) + k * n = ......,当n/(2^k) == 1时,即k == log2n,递归结束。此时T(n) = Cn + nlog2n,因此归并算法时间复杂度为O(nlogn);

空间复杂度

  1. 归并算法不是原地排序算法;
  2. 空间复杂度并不像时间复杂度那样累加,即在每次合并的时候都会申请新的内存空间,但是合并之后就释放掉了,因此空间复杂度是O(n);

《数据结构与算法之美》 -- 王争

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值