递归程序和非递归程序哪个有优势
排序算法十大经典方法?
排序算法十大经典方法?
十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示;这还不够,我还附上了对应的优质文章,看完不懂你来砍我,如果不想砍我就给我来个好看。
术语解释
有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下:
1、稳定排序:如果 a 原本在 b 的前面,且 a b,排序之后 a 仍然在 b 的前面,则为稳定排序。
2、非稳定排序:如果 a 原本在 b 的前面,且 a b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
4、非原地排序:需要利用额外的数组来辅助排序。
5、时间复杂度:一个算法执行所消耗的时间。
6、空间复杂度:运行完一个算法所需的内存大小。
十大排序
为了方便大家查找,我这里弄一个伪目录。
选择排序
插入排序
冒泡排序
非优化版本
优化版本
希尔排序
归并排序
递归式归并排序
非递归式归并排序
快速排序
堆排序
基数排序
非优化版本
优化版本
桶排序
基数排序
后序遍历的实质?
后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。
JAVA中能够实现方法的递归调用吗?如何实现?
可以递归调用
可以。所有的递归都可以使用循环来实现的,递归可能会出现栈溢出,实际过程中还是建议使用循环来实现。
实现
任意写一个函数,在函数体内自己调用自己就可以了。重要的是记住要在指定的条件下跳出,否则会无限递归,最终导致内存溢出。
以二叉树的前序遍历为例:
递归实现
学习了解递归和尾递归的区别?
递归,就是在运行的过程中调用自己。 构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 以递归方式实现阶乘函数的实现: [cpp] view plain copy int fact(int n) { if (n 0) return 0; else if(n 0 || n 1) return 1; else return n * fact(n - 1); }