1.什么是递归:方法调用其本身。

2.怎么样去实现

需要写递归表达式,递归表达式分为:

1)递归出口

2)递归关系

例1:斐波那契数:1,1,2,3,5,8,13........n,求第n 项

1)递归关系:f(1)=1,

f(2)=1,

f(3)=2,

f(4)=f(2)+f(3)=3,

f(5)=f(3)+f(4)=5,........

得出递归关系:  f(n)=f(n-1)+f(n-2),

2)递归出口就是n=1时f(1)=1,n=2是f(2)=1,是它两个就return

看如下代码:

public class Fiboncii {public static void main(String[] args) {int a=f(6);System.out.println(a);}private static int f(int i) {if(i==1||i==2) {return 1;}return f(i-1)+f(i-2);}
}

结果:

因为递归是它自己调用自己本身,浪费资源大,运行时间比循环时间长,所以效率非常的低。

我们再看用递归的方法实现归并排序:

这是我们要排序的数组:5,7,4,2,0,3,1,6

整体思路如下图:

把它们从中间分开,然后在合并,合并时按分开时的原路合并,并且安大小排序。

先找出递归表达式:

1)递归关系:

f(arr,left,right)

2)递归出口:left==right时,递归结束再开始合并

代码如下:

public class Mersort {public static void main(String[] args) {int[] arr= {1,22,32,12,65,33,98,12};mergesort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}//递归分解private static void mergesort(int[] arr, int left, int right) {// TODO Auto-generated method stubif(left==right) {return;}int mid=(left+right)/2;mergesort(arr, left, mid);mergesort(arr, mid+1, right);merge(arr,left,mid,right);}//合并并排序private static void merge(int[] arr, int left, int mid,int right) {// TODO Auto-generated method stubint s1=left;int s2=mid+1;int[] temp=new int[(right-left)+1];int i=0;while(s1<=mid&&s2<=right) {if(arr[s1]>=arr[s2]) {temp[i++]=arr[s2++];}else {temp[i++]=arr[s1++];}}while(s1<=mid) {temp[i++]=arr[s1++];}while(s2<=right) {temp[i++]=arr[s2++];}for(int j=0;j<temp.length;j++) {arr[j+left]=temp[j];}}
}

由上面执行图可以看到,先递归,再排序,后合并,递归的时间复杂度为log n,排序时间复杂度为n,所以归并的时间复杂度为O(nlogn)

使用递归实现归并排序及归并排序的时间复杂度相关推荐

  1. 算法笔记-归并排序、归并排序时间复杂度、例题

    1. 归并排序 1)整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2)让其整体有序的过程里用了外排序方法 3)利用master公式来求解时间复杂度 4)归并排序的实质,实质是减少了元素间 ...

  2. python递归合并排序_python 归并排序的递归法与迭代法(利用队列)实现,以及性能测试...

    递归排序核心 递归排序的核心是 分与合 分的最终结果 就是将原数组中每一个数字分作一个数组, 合就是 所有小数组不断排序,合并的过程. 合并的过程是先将两个含有一个数字的数组排序,合并(每次比较两个数 ...

  3. 排序算法-归并排序的实现与时间复杂度分析

    归并排序 归并排序是分而治之的排序算法. 划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序. 递归写法 归并排序递 ...

  4. Pyhton 描述 归并排序算法详解 时间复杂度,空间复杂度分析

    算法描述分析: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有 ...

  5. 归并排序、快速排序和时间复杂度

    归并排序: 引述:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列 1.两路归并排序算 ...

  6. 归并排序 java_归并排序(Java实现)

    package primary_01;/** 归并排序* 1.算法实现* 2.验证算法的正确性* 3.分析算法的复杂度*/public class Merge_sort {public static ...

  7. python归并排序 分词_python实现归并排序,归并排序的详细分析

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的. 很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚 ...

  8. 内部排序-归并排序-2-路归并排序

    文字描述 假设初始序列有n个记录,则可看成是n个有序的字序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列:再两两归并,-, 如此重复,直到得到一个长度为n的有序序列为 ...

  9. python归并排序_python归并排序

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python写归并排序 开始今天内容之前,先给大家推荐一款审核利器,goince ...

最新文章

  1. 荣耀预装linux安装包,关于华为机子没有预装应用商店讨论
  2. nyoj--364--田忌赛马(贪心)
  3. KinectFusion——微软基于KINECT的实时三维重建项目(KINECT)
  4. 论文参考文献的组织(latex)
  5. python解析树_如何使用python中的stanford解析器获取树的叶子?
  6. 与Spring的计划任务一起按时运行
  7. Oracle 自带sqldeveloper导入数据到表
  8. JS——构造函数、原型与实例之间的关系 及 原型链 的描述
  9. Kotlin — 介绍各类异步程序设计
  10. java矩阵相乘泛型_21.8 实例学习:泛型矩阵类
  11. macOS Big Sur 11.6 (20G165) With OC 0.7.3 / Clover 5139 / PE 三分区原版DMG黑苹果镜像
  12. Java根据模板生成excel并下载
  13. 黑客防线2012合订本
  14. VS2008 简体中文正式版序列号(到期解决办法)
  15. 关于友情的励志故事------火炉的故事
  16. 高德地图-----国家和省级地图切换
  17. pandas分组聚合
  18. 中国家电闯入国外运营费成本比中国高
  19. 英语语法长难句——定语和定语从句
  20. Hive项目之谷粒影音:ETL清洗原数据、Hive统计视频观看数top10、视频类别top、视频观看数top其所属类别、类别流量top、类别热度top、上传视频用户数量top、类别视频观看top

热门文章

  1. 输入一个由若干单词组成的文本行,每个单词之间用若干个空格隔开,统计此文本中单词的个数。/验证实验/
  2. Apollo配置中心与本地配置优先级
  3. LeetCode779 第K个语法符号 python刷题Day5
  4. linux命令partprobe
  5. docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件
  6. SNMP监控模板制作
  7. EMO-DB数据集介绍(即berlin的那个数据集)
  8. vue cdn引入第三方依赖
  9. [2012-05-10 09:52:11 - xxx] Failed to install xxx.apk on device '100046a35a59': timeout
  10. html5如何设置静音,如何取消静音HTML5视频有一个静音道具