1. 递归排序题

通过递归算法来获取一个数组中的最大值

2. 算法思路

采用递归的思路来进行解题,那么肯定是需要自己调用自己的,这也就是递归,于是考虑怎么自己调用自己呢?我们可以采用二分法来制造递归的情况:
我们先取数组的下标中点,将数组分成两份,我们要一直分下去,直到每个单个元素全部出现,这个时候来比较其大小,并往上将最大值赋值给上级根节点,上级根节点和另外一个根节点比较,再传值…

3. 算法程序及注释

class Program{static void Main(string[] args){int[] t = { 3, 2, 1, 7, 8, 9, 0 };var m = GetMax.getMax(t);Console.WriteLine(m);Console.ReadLine();}}class GetMax{//方便调用public static int getMax(int[] arr){return process(arr, 0, arr.Length - 1);}//arr[L..R]范围求最大值public static int process(int[] arr, int L, int R){//到最后一个点时,返回他到上一级if (L == R){return arr[L];}//这一段是为了展现递归时的值//for (int i = L; i <= R; i++)//{//    Console.WriteLine(arr[i]);//}int mid = L + ((R - L) >> 1);//中点,这样写是比较讲究的写法,拿右移位的位运算来代替除以2的操作,原因是位运算比较快//另外,一般平均值是这样(b+a)/2,但是b+a可能会溢出数据类型的最大范围,所以我们不这样写int leftMax = process(arr, L, mid);//取左边最大值,来递归一次int rightMax = process(arr, mid + 1, R);//取右边最大值,来递归一次return Math.Max(leftMax, rightMax);//最终比较叶节点,值给根节点}}

理解程序的流程图:

4. 递归的时间复杂度与master公式

怎么来对递归行为的时间复杂度来进行估算?
使用master公式(也称主方法)(对于一些特定的递归行为而言),是用来利用分治策略来解决问题经常使用的时间复杂度的分析方法
公式:
T(N)=a*T(N/b)+O(N^d)

使用条件:
1.里面递归的子项必须相同
2.n表示问题的规模
3.a是多少个相同的子项,表示递归的次数也就是生成的子问题数
4.(N/b)是说,把一个整的分了多少份,b表示每次递归是原来的1/b之一个规模
5.d指是,剩下的项是多少时间复杂度

举例来说,把一个数组分成了3份来递归,并逐次打印一遍数,那么我们发现子项都是1/3,符合第一个条件(递归的子项必须相同),于是a=3,N/b=1/3N,剩下的时间复杂度(逐次打印一遍数)是O(N),那么d=1的(因为O(N^d)=O(N))
也就是:T(N)=3*T(N/3)+O(N)
然后把a,b,d来进行下面结论的比较,发现符合等于的情况,那么该递归时间复杂度是O(N * logN)

结论:
注: log(b,a)也就是以b为底,a的对数

  1. log(b,a)>d =>复杂度为O(N^log(b,a))
  2. log(b,a)<d =>复杂度为O(N^d)
  3. log(b,a)=d =>复杂度为O(N^d * logN)

算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)相关推荐

  1. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  2. 第29讲 常见算法(查找算法、递归算法、排序算法)

    文章目录 查找算法 1. 基本查找 2. 二分查找 3. 插值查找 4. 斐波那契查找 5. 分块查找 6. 哈希查找 7. 树表查找 递归算法 排序算法 1. 冒泡排序 2. 选择排序 3. 插入排 ...

  3. 算法 | 时间复杂度master 公式

    master 公式 T(N) = a*T(N/b) + O(N^d) 估计递归问题复杂度的通式,只要复杂度符合以下公式,都可以套用此公式计算时间复杂度 例子:递归方式查找数组最大值 T(N) = 2* ...

  4. 《算法笔记》-各种排序算法、散列、递归、贪心、二分、双指针、随机选择算法(知识点+例题+代码)

    一.排序 1.冒泡排序 进行数组大小-1趟排序 int a[]={3,4,1,5,2};//从小到大排序 //第一趟 3,4,

  5. 算法笔记----递归算法

    文章目录 概念 递归算法的优缺点 经典例题 递归算法的优化 实战演练 概念 官方解释:一种通过重复将问题分解为同类的子问题而解决问题的方法. 我的理解:一种把大问题拆分成若干个算法逻辑相同的子问题,只 ...

  6. 算法中的各种排序以及查找时间复杂度

    今天简单的总结一下算法中经常用到的排序以及查找(用C语言实现,不全,持续更新) 一.首先是最常见也是最常被问的冒泡排序(原理就是每趟排序相邻两两比较...因为比较好理解,就省略了) //冒泡排序 -( ...

  7. 算法笔记_036:预排序(Java)

    目录 1 问题描述 2 解决方案 2.1 检验数组中元素的唯一性 2.2 模式计算   1 问题描述 在计算机科学中,预排序是一种很古老的思想.实际上,对于排序算法的兴趣很大程度上是因为这样一个事实: ...

  8. 算法笔记4.1--EXCEL排序

    题目描述 Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始).随后在 N ...

  9. 算法笔记1926ProblemC Excel排序

    题目描述 Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始).随后在 N ...

最新文章

  1. Java程序的运行原理 用记事本编写Java代码
  2. 车辆检测--DAVE: A Unified Framework for Fast Vehicle Detection and Annotation
  3. ASP.NET 获取客户端IP (无视代理)
  4. 单词evolve pro legacy launcher session
  5. php web server部署(PHP+Nginx+Redis+MySQL)
  6. 前端学习(3120):react-hello-react的setstate的使用
  7. 低代码会让程序员更加内卷吗?
  8. 在html中引用分享的链接
  9. 微信公号“架构师之路”学习笔记(五)-数据库扩展性架构设计(水平切分,秒级扩容,平滑迁移,在线表结构变更,一个大数据量多属性高并发的数据库设计等)
  10. ubuntu中使用.rpm
  11. 用计算机控制人造卫星和导弹发射,广西成人高校计算机实用基础统考理论试题(...
  12. matlab查表svpwm,SVPWM的MATLAB仿真实现
  13. 通过qmh启动qt应用
  14. 小学计算机上机评分表,海安市实验小学信息技术学科素养考核方案
  15. MySQL入门系列:MySQL数据类型
  16. 大厂程序员的一天是如何度过的?
  17. 在C ++中将二进制转换为十进制
  18. 微信公众号(服务号)申请时候需要补充的资料
  19. Python爬虫爬取古诗文网站项目分享
  20. MySQL常用存储引擎——Archive

热门文章

  1. 完全相同的4个小矩形如图所示放置_3个数学难题——走进传奇数学天才的数字游戏...
  2. 如何更好的招聘软件测试人员?
  3. machine learning
  4. Python3通过汉字输出拼音
  5. golang 使用 protobuf 的教程
  6. 如何阅读JAVA 字节码(一)
  7. 笔记 - Git使用
  8. VS2010在工具栏上创建查找组合框,即:CMFCToolBar中加入CMFCToolBarComboBoxButton
  9. 一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(3)-操作对象的识别原理...
  10. 老赵的自然数分解——少侠之对象解