30、最短路径:弗洛伊德(Floyd)算法与乘车费用最少的问题

你好,我是王健伟。 上节课我和你分享了用迪杰斯特拉(Dijkstra)算法求解最短路径。除此之外,还有一个求解最短路径的方法——佛洛依德(Floyd)算法。 那他们有什么不同吗? 如果说迪杰斯特拉算法比较适合一次性求某个顶点到其他各个顶点的最短路径信...

快速上手C++数据结构与算法

31、图的应用:如何通过拓扑排序找到合理的先后顺序

你好,我是王健伟。 在我和你分享了两个图的应用,最小生成树和最短路径相关的算法之后,我们来说说拓扑排序。 拓扑排序主要是解决一个工程能否按顺序进行的问题。在正式讲解之前,我们首先来一起认识一下几个基本概念。 拓扑排序基本概念首先,有向无环图(Dire...

快速上手C++数据结构与算法

32、图的应用:如何通过关键路径估算完成工程需要的最短时间

你好,我是王健伟。 这节课我们学习图的应用中的最后一个话题——关键路径问题。它解决的事估算完成某个工程所需要的最短时间的问题。说到“最短时间”,你应该就能反应过来,它是一个能帮助我们提高生产效率的算法。 我们还是从它涉及的基本概念开始说起。 “关键路...

快速上手C++数据结构与算法

33、直接插入排序:为什么数据越有序,排序速度越快

你好,我是王健伟。 我们已经一起学习了不少主要的数据结构知识。不知你学得怎么样了,是不是很轻松呢?从这节课开始,咱们就要进入到算法知识的学习了。 这一次,我们学习一下“排序”算法。 无论是日常生活还是很多科学领域当中,排序都是会经常面对的问题,比如按...

快速上手C++数据结构与算法

34、希尔排序:通过部分有序逼近全局有序

你好,我是王健伟。 上一节我们讲解了直接插入排序算法。回顾前面学习的直接插入排序,不难想到下面两个问题。 首先,在待排序的数组中,元素本身就是有序的情况下,就不需要移动任何元素,所以直接插入排序最好情况时间复杂度为O(n)。不难想象,如果数组中元素多...

快速上手C++数据结构与算法

35、冒泡排序:大数下沉,小数上浮

你好,我是王健伟。 前面我带你学习了插入类排序中的直接插入排序和希尔排序,这次,我们讲解另一类排序——交换类排序。 所谓交换类排序,就是根据序列中两个关键字的比较结果,来决定是否要交换这两个关键字对应的记录在序列中的位置。 交换类排序主要包括冒泡排序...

快速上手C++数据结构与算法

36、快速排序:如何通过基准元素改进冒泡排序

你好,我是王健伟。 前面我们一起学习了交换类排序中的冒泡排序,这次我们继续学习交换类排序中的快速排序。这两种排序算法的主要区别在于排序的效率和实现代码。 如果说冒泡排序是通过相邻元素的比较和交换达成排序,那么快速排序就是一种分而治之的思想,是对冒泡排...

快速上手C++数据结构与算法

37、简单选择排序与堆排序:多趟排序与利用有序完全二叉树进行排序

你好,我是王健伟。 前面我们一起学习了交换类排序,也就是在排序过程中对元素进行两两比较并交换位置。其中,最知名的交换类排序算法——冒泡排序、快速排序我们都已经讲过了。这次,我们学习一个新的排序种类——选择类排序。 选择类排序是一种基于比较的排序算法,...

快速上手C++数据结构与算法

38、归并排序:将多个有序序列按其中的元素值大小两两合并

你好,我是王健伟。 上节课我们一起学习了选择类排序,回顾前面所讲,你会发现选择类排序的特点是每次从待排序的元素中选择一个最小或最大值,依次放到已经排序的序列末尾,最终得到有序序列。 而这次,我们学习一下归并排序。归并排序自成一类,它的实现方式和选择类...

快速上手C++数据结构与算法

39、串的顺序和链式存储结构:定长数组与动态数组

你好,我是王健伟。 前面我带你一起学习了各种各样的排序算法。从这节课开始,我们就要进入到字符串的学习了。 字符串作为一种数据结构,在计算机科学领域也有着比较广泛的应用。比如在搜索引擎中搜索一个关键词、在文章或发言中过滤或屏蔽一些敏感词等。这些关键词、...

快速上手C++数据结构与算法