递归算法

经典排序算法总结

喜欢而已 提交于 2019-12-05 04:26:58
概述 选泡插, 快归堆希桶计基, n方n老(log)n一三, 对n加kn乘k, 不稳稳稳不稳稳, 不稳不稳稳稳稳。 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性 冒泡排序(BubbleSort) O(n 2 ) O(n) O(n 2 ) O(1) In-place 稳定 选择排序(SelectSort) O(n 2 ) O(n 2 ) O(n 2 ) O(1) In-place 不稳 插入排序(InsertSort) O(n 2 ) O(n) O(n 2 ) O(1) In-place 稳定 希尔排序(ShellSort) O(n 1.3 ) O(n) O(n log 2 n) O(1) In-place 不稳 归并排序(MergeSort) O(n log n) O(n log n) O(n log n) O(n) Out-place 稳定 快速排序(QuickSort) O(n log n) O(n log n) O(n 2 ) O(log n) In-place 不稳 堆排序(HeapSort) O(n log n) O(n log n) O(n log n) O(1) In-place 不稳 计数排序(CountSort) O(n + k) O(n + k) O(n + k) O(k) Out-place 稳定 桶排序(BucketSort)

递归越做越忘,刚开始还写的好,后来就无从下手,看完代码又恍然大悟

我的梦境 提交于 2019-12-05 04:17:57
设一个基准情况;再调用 第二个情况由第一个情况递推,再调用; 达到某个情况,返回值。 有5个人围坐在一起,问第5个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,请利用递归法编程计算并输出第5个人的年龄。 include <stdio.h> unsigned int ComputeAge(unsigned int n); main() { unsigned int n = 5; printf("The 5th person's age is %d\n", ComputeAge(n)); } /* 函数功能:用递归算法计算年龄 */ unsigned int ComputeAge(unsigned int n) { unsigned int age; if (n == 1) { age = 10; } else { age = ComputeAge(n - 1) + 2; } return age; } 来源: https://www.cnblogs.com/dosu/p/11905195.html

数据结构与算法-10-递归调用

♀尐吖头ヾ 提交于 2019-12-05 04:11:07
递归详解-典型递归介绍 http://chenqx.github.io/2014/09/29/Algorithm-Recursive-Programming/ 1.如何理解“递归”?(什么是递归) 去的过程叫“递”,回来的过程叫“归”f(n)=f(n-1)+1 备注:去的过程入栈的过程,回来的过程出栈 2.递归需要满足的三个条件(递归的特点) 2.1. 一个问题的解可以分解为几个子问题的解 2.2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 2.3. 存在递归终止条件 3.如何编写递归代码?(怎样实现递归) 3.1写出递推公式,找到终止条件 归纳:写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码 编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤 4.注意点(递归弊端) 递归代码要警惕堆栈溢出 递归代码要警惕重复计算 都可以将递归使用循环+栈实现 来源: https://www.cnblogs.com/mzyc/p/11904890.html

[] 递归算法

孤街浪徒 提交于 2019-12-05 03:03:28
3 、基本解题步骤或方法: 1) 明确递归函数功能。一定要明确递归程序的功能,对递归程序要完成的功能模棱两可、一知半解,往往导致逻辑混乱,写不出正确的递归程序。 2) 找出递归终止条件。所谓递归,就是在函数内部代码调用函数本身,所以,我们必须要找出递归的结束条件,否则,就会一直调用自己,陷入死循环。也就是说,我们需要找出当参数为何值时,递归结束。请注意,这个时候我们必须能根据参数的值,直接知道函数的结果是什么。 3) 找出递归等价关系。即找出怎么通过递归把一个大问题分割成若干小问题,通过解决若干个小问题再组合起来,来求解这个大问题。 4) 审视已写好的递归程序,看看递归终止条件是否足够严谨,防止不严谨的递归终止条件导致程序陷入死循环。 4 、例题解析: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 l、明确递归函数功能 假设函数Solution的功能是求青蛙跳上一个n级的台阶有多少种方法。先定义出函数的框架,如下: // 求青蛙跳上一个n级的台阶,总共有多少种跳法 int Solution(int n) { } 找出递归终止条件 找出递归终止条件,最常用的手法就是压缩问题的规模到很小的程度,小到可以直接算出Solution的返回值。所以,当n = 1时,有: // 求青蛙跳上一个n级的台阶,总共有多少种跳法 int Solution

数据结构与算法之美学习笔记:第十四讲

我只是一个虾纸丫 提交于 2019-12-05 00:30:27
一、课前问题 几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。 在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都利用了哪种排序算法呢? 基于这些问题,今天我们就来看排序这部分的最后一块内容:如何实现一个通用的、高性能的排序函数? 二、如何选择合适的排序算法 如果要实现一个通用的、高效率的排序函数,我们应该选择哪种排序算法?我们先回顾一下前面讲过的一种排序算法。 我们前面讲过,线性排序算法的时间复杂度比较低,适用场景比较特殊。所以如果要写一个通用的排序函数,不能选择线性排序算法。 如果对小规模数据进行排序,可以选择时间复杂度是O(n )的算法; 如果对大规模数据进⾏排序,时间复杂度是O(nlogn)的算法更加高效。 所以,为了兼顾任意规模数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。 时间复杂度是O(nlogn)的排序算法不止一个,我们已经讲过的有归并排序、快速排序,后面讲堆的时候我们还会讲到堆排序。堆排序和快速排序都有比较多的应用,比如Java语言采用堆排序实现排序函数,C语言使用快速排序实现排序函数。 不知道你有没有发现,

【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

前提是你 提交于 2019-12-04 20:51:38
本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢。 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点都只有有限个子节点或无子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树里面没有环路(cycle) 1.2常见术语 节点的度 :一个节点含有的 子树的个数 称为该节点的度; 树的度 :一棵树中,最大的节点度称为树的度; 叶节点 或 终端节点 :度为零的节点; 非终端节点 或 分支节点 :度不为零的节点; 父亲节点 或 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点 或 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 节点的 层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 深度 :对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0; 高度 :对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;

01玩转数据结构_05_链表和递归

心不动则不痛 提交于 2019-12-04 18:29:05
链表回顾: leetcode 题目(No.203 移除链表元素): 不使用虚拟头节点: 1 class Solution { 2 public ListNode removeElements(ListNode head, int val) { 3 //1,head.val 就是应该删除的节点 4 // if(head != null && head.val == val ){ 5 while(head != null && head.val == val ){ //之所以使用while是因为可能有多个。 6 ListNode delNode = head; 7 head = delNode.next; 8 delNode.next = null; 9 } 10 //2,head.val 不是应该删除的节点 11 if(head ==null){ 12 return null; 13 } 14 ListNode prePtr = head; //删除时应该要知道前一个节点。 15 while (prePtr.next != null){ 16 if(prePtr.next.val == val){ 17 ListNode delNode = prePtr.next; 18 prePtr.next = delNode.next; 19 delNode.next = null; 20

第29课 互斥量与自解锁(std::mutex和lock系列)

北战南征 提交于 2019-12-04 17:55:48
一. 互斥量 (一)Mutex系列类   1. std::mutex:独占的互斥量, 不能递归使用 。   2. std::recursive_mutex: 递归互斥量 。允许同一线程多次获得该互斥锁,可以用来解决同一线程需要多次获取互斥量时死锁的问题。   3. std::time_mutex和std::recursive_time_mutex: 带超时的互斥量 。 前者是超时的独占锁,后者为超时的递归锁 。主要用于获取锁时增加超时等待功能,因为有时不知道获取锁需要多久,为了不至于一直等待下去,就设置一个等待超时时间。比std::mutex多了两个超时获取锁的接口:try_lock_for和try_lock_until //1. 独占互斥锁,不能递归使用 class mutex { public: //std::mutex不支持copy和move操作。 mutex(const mutex&) = delete; mutex& operator=(const mutex&) = delete; constexpr mutex() noexcept; //构造函数:新的对象是未锁的 ~mutex(); void lock(); //上锁 void unlock(); //解锁 bool try_lock(); //尝试上锁。成功,返回true。失败时返回false,但不阻塞

树的一系列基本操作(附带哈夫曼树)

試著忘記壹切 提交于 2019-12-04 16:35:41
递归遍历树 //遍历算法 #include<iostream> using namespace std; typedef struct BiNode{ char data; struct BiNode *lchild,*rchild; }BiTNode,*BiTree; void CreratBiTree(BiTree &T){ char ch; cin>>ch; if(ch=='#') T=NULL; else{ T=new BiTree; T->data=ch; CreratBiTree(T->lchild); CreratBiTree(T->rchild) } } void InOderTraverserve(BiTree T){ if(T){ InOderTraverserve(T->lchild); cout<<T-data; InOderTraverserve(T->rchild); } } void main(){ BiTree tree; cout<<"please input\n"; CreratBiTree(tree); cout<<"middle result\n"; CreratBiTree(tree); cout<<"front result\n"; cout<<endl; } 非递归遍历树 //非递归遍历二×树 #include<iostream>

递归遍历树

試著忘記壹切 提交于 2019-12-04 16:32:22
//遍历算法 #include<iostream> using namespace std; typedef struct BiNode{ char data; struct BiNode *lchild,*rchild; }BiTNode,*BiTree; void CreratBiTree(BiTree &T){ char ch; cin>>ch; if(ch=='#') T=NULL; else{ T=new BiTree; T->data=ch; CreratBiTree(T->lchild); CreratBiTree(T->rchild) } } void InOderTraverserve(BiTree T){ if(T){ InOderTraverserve(T->lchild); cout<<T-data; InOderTraverserve(T->rchild); } } void main(){ BiTree tree; cout<<"please input\n"; CreratBiTree(tree); cout<<"middle result\n"; CreratBiTree(tree); cout<<"front result\n"; cout<<endl; } 来源: https://www.cnblogs.com/ygjzs/p/11874560