算法设计与分析分治法二分查找和合并排序

分治法解题步骤:

(1)分解:将要解决的问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
(2)治理:求解各个子问题。由于各个子问题与原问题形式相同,只是规模较小而已,而当子问题划分的足够小时,就可以用简单的方法解决。
(3)合并:按原问题的要求,将子问题的解逐层合并构成原问题的解。

二分搜索技术

问题描述:给定n个元素,这些元素是有序的,从中查找特定元素
算法思想:将有序序列分成规模大致相等的两部分,让中间元素和特定查找元素进行比较,如果中间元素大于特定查找元素,则在序列的前半部分继续查找,即在序列的前半部分进行重复分解和治理操作,如果中间元素小于特定查找元素,则在序列的后半部分继续查找,即在序列的后半部分进行重复分解和治理操作,如果中间元素和特定查找元素相等,则找到了该元素,查找终止,返回该查找元素下标。

举个栗子
请添加图片描述
算法复杂度分析
(1)时间复杂度,首先要进行排序,调用sort函数,进行排序的时间复杂度是O(nlogn),如果数列本身有序则不需考虑
二分查找的时间复杂度?
当n=1时,只需要比较一次 T(n) = O(1)
当n>1,特定元素和中间位置元素比较,需要O(1)时间,如果比较不成功,则需要在序列的前半部分或者后半部分查找,问题的规模缩小了一般,时间复杂度变成 T(n/2)
则递推求解请添加图片描述
则二分查找的时间复杂度为O(logn)
(2)空间复杂度 程序中变量占用了一些辅助空间,这些辅助空间都是常数阶的,因此空间复杂度为O(1)

二分查找的优缺点
1.优点:比较次数少;查找速度快;平均性能好
2.缺点:待查表为有序数组(若为无序数组,分成两份查找无意义,排序本身也耗费时间);插入删除困难(增删需要移动大量的节点)

合并排序

合并排序是采用分治法实现对n个元素进行排序的算法,是分治法的一个典型应用和完美体现。他是一种平衡、简单的二分分治策略。过程如下
(1)分解:将待排序的元素分解成两个规模相同、大小大致相同的子序列
(2)治理:将两个子序列进行合并排序
(3)合并:将排好序的有序子序列进行合并,得到最终的有序序列
举个栗子
请添加图片描述
复杂度分析
(1)合并排序的时间复杂度是O(nlogn)
分解这一步紧紧是计算出子序列的中间位置,需要常数时间O(1)
治理:解决子问题:递归求解两个规模为n/2的子问题,所需时间为2T(n/2)
合并:Merge算法可以在O(n)时间内完成
则总运行时间为
请添加图片描述
(2)空间复杂度为O(n)
程序变量占用了一些辅助空间,这些辅助空间都是常数阶的,没吊用一个Merge()会分配一个适当大小的缓冲区,且退出时释放,最多分配大小为n.

归并排序算法的优缺点: 归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界

归并排序是一种稳定的算法(即在排序过程中大小相同的元素能够保持排序前的顺序,3212升序排序结果是1223,排序前后两个2的顺序不变),这一点在某些场景下至关重要

归并排序是最常用的外部排序方法(当待排序的记录放在外存上,内存装不下全部数据时,归并排序仍然适用,当然归并排序同样适用于内部排序…)

缺点:归并排序需要O(n)的辅助空间,而与之效率相同的快排和堆排分别需要O(logn)和O(1)的辅助空间,在同类算法中归并排序的空间复杂度略高

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值