14、排序优化

思考:如何实现一个通用的、高性能的排序函数?

主要内容

如何选择合适的排序算法?


首先不考虑线性排序,虽然 O(n) 很诱人,但它们的适用场景太少了,所以放弃。
其次对小规模数据,可以使用 O(n2) 的;但对大规模数据就要考虑高效的 O(nlogn) 算法。
归并算法需要额外的内存,针对小数据时可以使用;而快排则不需要,常针对大数据使用

快速排序优化

快排的数据若已排序,那每次选择最后一个分区,则恶化为 O(n^2)
所以我们要合理选择分区点:尽量将数据平均分配在左右分区内

N 位数取中值法

比如:三位数取中值,从首、中间、尾取三个数,求中值最为分区点
若数据量大,则可以为“五位数、十位数”取中值

随机法

每次随机取分区点。随机比固定更容易出现好分区点

解答思考

各语言提供的排序函数,会存在根据数据量进行不同排序算法的处理。
比如:当数据量小时,会使用插入排序;当数据量大但内存少时,会使用归并排序,并且在递归到排序长度很小时,就停止递归采用插入排序;当数据量大内存也大,则使用快速排序

内容总结

不同的算法,有对应的场景。
所以各语言提供的排序函数,不会仅仅采用一种方式去实现,一定是竭尽所能的榨干性能

新的思考

JS 的数组 sort 函数使用的算法?

采用了插入、快排、归并这几种算法,会根据数据大小选择合适的或混用来实现排序


14、排序优化
https://mrhzq.github.io/职业上一二事/算法学习/极客-数据结构与算法之美/基本算法/14、排序优化/
作者
黄智强
发布于
2024年1月13日
许可协议