摘要: 一、课前问题 上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是O(n ),比较高,适合小规模数据的排序。今天,我讲两种时间复杂度为O(nlogn)的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。 归并排序和快速排序都 阅读全文
posted @ 2019-11-19 18:39 活的潇洒80 阅读(612) 评论(1) 推荐(0) 编辑
摘要: 一、课前问题 几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实 阅读全文
posted @ 2019-11-19 18:29 活的潇洒80 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 一、课前问题 今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。老规矩,我们还是来看一道思考题。 假设我们有1000万个整数 阅读全文
posted @ 2019-11-19 18:05 活的潇洒80 阅读(534) 评论(0) 推荐(0) 编辑
摘要: 一、课前问题 上两节中,我带你着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。今天,我会讲三种时间复杂度是O(n)的排序算法:桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时间复杂 阅读全文
posted @ 2019-11-19 18:01 活的潇洒80 阅读(455) 评论(0) 推荐(1) 编辑
摘要: 一、课前思考 两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫作跳表(Skiplist),也就是 阅读全文
posted @ 2019-11-19 17:46 活的潇洒80 阅读(300) 评论(0) 推荐(1) 编辑
摘要: 一、课前思考 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构牛逼线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出几道思考题:二叉树有哪几种存储方式?什 阅读全文
posted @ 2019-11-19 17:39 活的潇洒80 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 一、课前思考 上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是O(1)。既然有了这么高效的散 阅读全文
posted @ 2019-11-19 17:26 活的潇洒80 阅读(396) 评论(0) 推荐(0) 编辑