Go数据结构 | 青训营笔记

86 阅读2分钟

这是我参与 [第三届青训营 -后端场]笔记创作活动的第5篇笔记

为什么要学习数据结构与算法

程序开发所有地方都存在'

什么是最快的排序算法?

单线程: (看场景)

Python-timsort

C++-introsort

排序算法

Go 排序算法如何设计?

生产环境中使用的排序算法和课本上的排序算法,区别?

GO语言排序算法是快排吗?

插入排序(后面的无序序列,插入到前面的有序序列)

n

n*n

n*n

快速排序

n*logn

n*logn

n*n

堆排序

利用堆(数据结构)的性质

n*logn(all)

Benchmark

序列大小

序列无序

16:插排

128:堆排?❌ 快排!(堆排差距不大)

1024: 快排? √ (其一次遍历可以完成多个元素)(提前打好括号,没想到对啦)(堆排序,其实差别不大)

序列本身有序

短: 插排

中:插排

长:插排

插排有序,最快.(所有短序列,和有序序列,插入排序性能最好)

类比?

插入排序 > 单车(全都是自己做的)

快速排序 > 汽车

堆排序 > 地铁

能不能说,长距离用汽车/地铁,之后再用单车?

从0开始实现pdqsort

pattern-defeating-quicksort

不稳定的混合排序算法

  1. 短序列具体长度是多少?

12~32(场景不同) 选定:24

  1. 如何得知快速排序表现不佳,何时切换到堆排序?

    快速排序的pivot的位置,离两端很近(小于 len/8)[每次交换的元素少..],这样几次(limit)后换堆排序.limit:元素越多,limit越大

  2. 重复度高,怎么办?

    1. fallback时机
    2. pivot选择策略
    3. 针对不同pattern优化

\