一、递归--栈

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)堆排序

数据结构基础笔记(2)

用完全二叉树表示大根堆和小根堆:

对于小根堆而言,内节点关键字小于分支结点;

对于大根堆而言,内节点关键字大于分支结点。

 

堆的初始化:

(大根堆)a》若孩子结点均小于双亲结点,则该结点调整结束;

                 b》若存在孩子结点大于双亲结点,则将最大的孩子结点与双亲结点交换,并对该孩子结点进行上述操作,直到出现a或者叶节点为止 

堆排序:

不断地输出堆顶元素,并向下调整

时间复杂度o(nlog2n)   空间复杂度o(1)

不稳定算法

适用于顺序存储 (链式存储)

 

堆的插入--将新节点放置在末端,然后向上调整

7.8)归并排序--归并操作

二路归并排序----每一次归并相邻两组数据

时间复杂度o(nlog2n)   空间复杂度o(n)  稳定算法

适用于顺序存储和链式存储

8.基数排序--不基于比较

借助分配和收集两种操作对单逻辑关键字进行排序,分为最高位优先(MSD)和最低位优先(LSD).

稳定算法

数据结构基础笔记(2)

9.外部排序

采用归并排序方法

 

 

相关文章:

  • 2021-12-29
  • 2021-04-13
  • 2021-09-23
  • 2021-06-27
  • 2022-01-30
  • 2021-12-05
  • 2021-12-30
  • 2021-10-12
猜你喜欢
  • 2021-12-06
  • 2021-12-06
  • 2021-08-03
  • 2021-09-25
  • 2022-12-23
  • 2021-09-01
  • 2022-01-10
相关资源
相似解决方案