茶艺师学算法打卡7:排序(下)

91 阅读2分钟

茶艺师学算法打卡7:排序(下)

学习笔记

  1. 所谓线性排序算法,是指时间复杂度是O(n)O(n)的排序算法,因为不涉及元素之间的比较,代表有桶排序(Bucket sort)、记数排序(Counting sort)、基数排序(Radix sort)。
  2. 要理解桶排序,我想起了自己在图书馆打工的经历:把读者拿出来的书放回书架,我都会先按照“数学类”“生物类”“语言类”(这是我要途径的书架顺序)把书分好类,在各种的类目里把书按照编号从小到大排好序,这样我推着书车来到书架,就能很快把书插入它应该待的地方......先按照“具有顺序的大类”分类,再在类中排序,最后再连在一起,这就我所理解的桶排序。
  3. 外部排序,是指数据量过大不能都放进内存里计算的排序方法,桶排序就是比较适合用着这场景。
  4. 记数排序是桶排序的特殊情况,就是“桶”的颗粒度会更小。这就好比,在给班上的同学考试试卷按照分数排序,实际操作时就很容易把某一分数的试卷放在一起,这样一来也清楚考到了这分数的同学有多少人。这算法稳不稳定得看具体实现,像专栏文章里老师提供的示例就稳定排序,他使用了额外的数组来维持元素之间的相对关系。
  5. 基数排序,最经典的例子就是手机号排序,从手机号的最低位开始,一位位往上排,而且每一步都要用稳定排序(不然排好的低位就没意义了)。这要求排序的数据能“一位位地比较,且位与位之间有递进关系”,且数据范围还不能太大。
  6. 可以根据需要实现心目中的“通用、高性能”的排序算法,其实现方法如专栏里所说,选择一个排序算法,然后根据自己的使用需要进行“定制”。比如 go 语言的 sort 包,里面的排序算法就是基于经过特定优化的快速排序算法

结语

学到这里,借着这些排序算法,我开始感受到了,算法,与其是某大段大段的代码实现,更是一种“如何处理数据,获得结果的策略”。
而是与其把这些排序算法的实现代码背下来,更重要的是吃透这些“策略”。