一、递归--栈
1.定义:一个函数自己直接或间接调用自己
2.举例 : 1)1+2+....+100
2)求阶乘
3)汉诺塔
4)走迷宫
3.递归满足的三个条件
1)递归必须有一个明确的终止条件
2)该函数所处理的数据规模必须在递减 (值可以是递增的)
3)这个转化必须是可解的 (把已知的经典递归记住)
4.循环和递归
递归:易于理解 ,但速度慢,存储空间大 (不断分配空间保存,反复调用函数)
循环:不易理解,但速度快,存储空间小
5.递归的应用 树和森林就是以递归的方式定义的
树和图的很多算法都是以递归来实现的
很多数学公式就是以递归的方式定义的 (斐波拉契数列)
二、栈--只允许在一端进行删除与插入
1.定义:一种可以实现“先进后出”的存储结构 <栈类似于箱子>
2.分类:静态栈
动态栈
3.算法:出栈、压栈
4.应用:函数调用
中断
表达式求值
内存分配
缓冲处理
迷宫
三、队列--在一端插入,另一端进行删除
1.定义:一种可以实现“先进先出”的存储结构 <类似于排队买票>
2.分类:链式队列--用链表实现
静态队列--用数组实现 (静态队列通常都必须是循环队列)
--静态队列为什么必须是循环队列?
--循环队列需要几个参数来确定? 需要2个参数来确定 front rear
2个参数不同场合有不同的含义
建议初学者先记住,然后慢慢体会:
1)队列初始化 front和rear的值都是零
2)队列非空 front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素
3)队列空 front和rear的值相等,但是不一定为零
--循环队列入队伪算法的讲解
1)将值存入rear所代表的位置
2)错误的写法:r=r+1; 正确的写法:r=(r+1)%数组的长度
--循环队列出队伪算法的讲解
1)出队的值保存起来(可选步骤)
2)f=(f+1)%数组的长度
--如何判断循环队列是否为空 如果front和rear的值相等,则一定为空
--如何判断循环队列是否已满 (front的值可能比rear大、小、相等)
1)多增加一个标志参数
2)少用一个元素【通常使用第二种方式】
如果r和f的值紧挨着,则队列已满。
if((r+1)%数组的长度==f)
已满
else 未满
3.算法:入队,出队
4.队列应用:所有和时间有关的操作都有队列的影子
四、排序
1.排序算法的稳定性只是算法的性质,并不能衡量一个算法的优劣。
稳定性--若待排序的两个元素,在使用排序算法后,该两元素的先后位置为发生改变,则是稳定的。
2.内部排序--在排序期间元素全部存放在内存中
外部排序--排序期间元素无法全部同时存放在内存中,必须在排序过程中根据要求不断地在内外存之间进行移动。
3.时空复杂度决定内部排序算法的性能
4..插入排序--每次将一个待排序的序列插入到一个前面已经排好序的子序列当中
1)直接插入 插入--后移 空间复杂度o(1) 时间复杂度o(n*n) 稳定算法
适用于顺序存储和链式存储
2)折半插入 折半查找o(log2n)+移动o(n) 空间复杂度o(1) 时间复杂度o(n*n) 稳定算法 适用于顺序存储
3)希尔排序--缩小增量排序
让序列逐步变成有序序列,然后对其进行插入排序
基本思想:
先将排序表分割成d个形如i,i+d,i+2d...的特殊子表,分别进行直接插入排序,当整个表中的元素已经呈现基本有序时,再对全体记录进行一次直接插入排序。
时间复杂度 o(n*n) 不稳定算法 适用于顺序存储 空间复杂度o(1)
5.交换排序
4)冒泡排序 两两比较交换值 时间复杂度o(n*n) 空间复杂度o(1) 稳定算法 适用于顺序存储和链式存储
5)快速排序
选取一个元素作为基准,一趟排序划分两部分 递归
不稳定算法 最好、平均时间复杂度o(nlog2n) 空间复杂度o(log2n)
初始基本有序或逆序时,最坏时间复杂度o(n*n) 空间复杂度o(n)
适用于顺序存储 (链式存储)
6.选择排序--选取最小元素
6)直接选择排序 不稳定 时间复杂度与初始序列无关 时间复杂度o(n*n) 空间复杂度o(1) 适用于顺序存储和链式存储
7)堆排序
用完全二叉树表示大根堆和小根堆:
对于小根堆而言,内节点关键字小于分支结点;
对于大根堆而言,内节点关键字大于分支结点。
堆的初始化:
(大根堆)a》若孩子结点均小于双亲结点,则该结点调整结束;
b》若存在孩子结点大于双亲结点,则将最大的孩子结点与双亲结点交换,并对该孩子结点进行上述操作,直到出现a或者叶节点为止
堆排序:
不断地输出堆顶元素,并向下调整
时间复杂度o(nlog2n) 空间复杂度o(1)
不稳定算法
适用于顺序存储 (链式存储)
堆的插入--将新节点放置在末端,然后向上调整
7.8)归并排序--归并操作
二路归并排序----每一次归并相邻两组数据
时间复杂度o(nlog2n) 空间复杂度o(n) 稳定算法
适用于顺序存储和链式存储
8.基数排序--不基于比较
借助分配和收集两种操作对单逻辑关键字进行排序,分为最高位优先(MSD)和最低位优先(LSD).
稳定算法
9.外部排序
采用归并排序方法