使用递归实现归并排序及归并排序的时间复杂度
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)整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2)让其整体有序的过程里用了外排序方法 3)利用master公式来求解时间复杂度 4)归并排序的实质,实质是减少了元素间 ...
- python递归合并排序_python 归并排序的递归法与迭代法(利用队列)实现,以及性能测试...
递归排序核心 递归排序的核心是 分与合 分的最终结果 就是将原数组中每一个数字分作一个数组, 合就是 所有小数组不断排序,合并的过程. 合并的过程是先将两个含有一个数字的数组排序,合并(每次比较两个数 ...
- 排序算法-归并排序的实现与时间复杂度分析
归并排序 归并排序是分而治之的排序算法. 划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序. 递归写法 归并排序递 ...
- Pyhton 描述 归并排序算法详解 时间复杂度,空间复杂度分析
算法描述分析: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有 ...
- 归并排序、快速排序和时间复杂度
归并排序: 引述:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列 1.两路归并排序算 ...
- 归并排序 java_归并排序(Java实现)
package primary_01;/** 归并排序* 1.算法实现* 2.验证算法的正确性* 3.分析算法的复杂度*/public class Merge_sort {public static ...
- python归并排序 分词_python实现归并排序,归并排序的详细分析
学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的. 很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚 ...
- 内部排序-归并排序-2-路归并排序
文字描述 假设初始序列有n个记录,则可看成是n个有序的字序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列:再两两归并,-, 如此重复,直到得到一个长度为n的有序序列为 ...
- python归并排序_python归并排序
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python写归并排序 开始今天内容之前,先给大家推荐一款审核利器,goince ...
最新文章
- 荣耀预装linux安装包,关于华为机子没有预装应用商店讨论
- nyoj--364--田忌赛马(贪心)
- KinectFusion——微软基于KINECT的实时三维重建项目(KINECT)
- 论文参考文献的组织(latex)
- python解析树_如何使用python中的stanford解析器获取树的叶子?
- 与Spring的计划任务一起按时运行
- Oracle 自带sqldeveloper导入数据到表
- JS——构造函数、原型与实例之间的关系 及 原型链 的描述
- Kotlin — 介绍各类异步程序设计
- java矩阵相乘泛型_21.8 实例学习:泛型矩阵类
- macOS Big Sur 11.6 (20G165) With OC 0.7.3 / Clover 5139 / PE 三分区原版DMG黑苹果镜像
- Java根据模板生成excel并下载
- 黑客防线2012合订本
- VS2008 简体中文正式版序列号(到期解决办法)
- 关于友情的励志故事------火炉的故事
- 高德地图-----国家和省级地图切换
- pandas分组聚合
- 中国家电闯入国外运营费成本比中国高
- 英语语法长难句——定语和定语从句
- Hive项目之谷粒影音:ETL清洗原数据、Hive统计视频观看数top10、视频类别top、视频观看数top其所属类别、类别流量top、类别热度top、上传视频用户数量top、类别视频观看top
热门文章
- 输入一个由若干单词组成的文本行,每个单词之间用若干个空格隔开,统计此文本中单词的个数。/验证实验/
- Apollo配置中心与本地配置优先级
- LeetCode779 第K个语法符号 python刷题Day5
- linux命令partprobe
- docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件
- SNMP监控模板制作
- EMO-DB数据集介绍(即berlin的那个数据集)
- vue cdn引入第三方依赖
- [2012-05-10 09:52:11 - xxx] Failed to install xxx.apk on device '100046a35a59': timeout
- html5如何设置静音,如何取消静音HTML5视频有一个静音道具