请注意,这道题中的所有快速排序题解的时间复杂度复杂度均是错误的

P1923 【深基9.例4】求第 k 小的数

Autre @ 2023-11-15 14:34:03

在每轮递归中,按照某种确定性方案选出一个元素作为基准元素,这样的算法的时间复杂度为 O(n^2),只有随机选取一个元素才能让其复杂度降至期望 O(n\log n),最劣 O(n^2)


by fjy666 @ 2023-11-15 14:38:54

哇哇哇,楼主好懂啊,哇哇哇,天才,实力强劲!!!!!!感谢楼主解答我多年疑惑!!!!


by 初星逝者 @ 2023-11-15 14:41:50

@Castilian sort 不是 O(n~log~n) 的吗


by No21 @ 2023-11-15 14:43:46

@初星逝者 快排是指手写的,不是 sort,再者 sort 也不是快排。


by Little_Cart @ 2023-11-15 14:47:03

@No21 真不是吗?


by fjy666 @ 2023-11-15 14:48:41

@Little_Cart sort 确实不是快排,sort 是内省排序。


by 初星逝者 @ 2023-11-15 14:48:47

@No21 sort 不是期望 O(n~log~n) 的吗


by zhaohanwen @ 2023-11-15 14:49:42

@初星逝者 spfa 不是期望 O(kn) 的么。


by Little_Cart @ 2023-11-15 14:50:47

@fjy666 我 bdfs 了一下,答案是这么说的()

sort()函数的实现原理

 也许你会疑问,我使用sort方法对数据进行排序就一定合适吗?sort()可以根据我的需要对数据进行排序吗?其实sort()函数还是一个比较灵活的函数。很多解释是:sort()函数是类似于快速排序的方法,时间复杂度为n*log2(n),执行效率较高。

 其实STL中的sort()并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。所以说sort()是一个比较灵活的函数,它也会根据我们数据的需要进行排序,所以我们就不用担心以上的问题了。对于大部分的排序需求,sort()都是可以满足的。


by No21 @ 2023-11-15 14:50:57

@Little_Cart 如是,sort 是由三种排序方式组成的,它会根据情况选择插入排序,快速排序和堆排序(貌似是堆排),如果只有快排需要排序的题每一题都卡 sort 了。


by Little_Cart @ 2023-11-15 14:51:28

@zhaohanwen 这真别尬黑,sort不能被卡


| 下一页