校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 数据结构 > 堆排序
题目

如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用()方法最快

A.起泡排序

B.快速排序

C.希尔排序

D.堆排序

解答

正确答案是 D

构造堆为线性时间,取前5为5 * log2(1000)时间。

C 8条回复 评论
Vincent

太好了,明了易懂,感谢

发表于 2023-01-20 23:00:00
0 0
落星辰

时间复杂为O(1000)+log(999)+log(998)+log(997)+log(996)
其实就是O(N)+n×log(N)
N为所有数字的数量,n为你要需找的最小的n个数

发表于 2018-10-13 11:10:22
0 0
子不语

注意,是“第5个最小元素之前的部分排序”,果断构造小顶堆啊,快排是把所有的数都排序了,有点不符题意,而且不稳定。

发表于 2018-10-13 11:10:11
0 0
寒山远火

限定了1000和5的之后,是不是要看具体的比较和交换次数?

发表于 2018-10-13 11:10:01
0 0
人生赢家

堆排序复杂度是1000*log(5),需要构造的是5个结点的大顶堆,之后遍历数组,如果数组中的数小于堆顶,那么赋值给堆顶,并且调整大顶堆,这个操作复杂度是log(5)。当然还需要从堆结构中不断取出堆顶元素然后调整堆,这个操作时间复杂度相比之下低很多。

根据该题改动过后选择排序时间和选择排序复杂度是5*1000。

改动快排的话时间复杂度应该是介于前两者之间,而且和具体的数组,不同情况有关。

发表于 2018-10-13 11:09:48
0 0
王王王

题目有歧义吧,“第5个最小元素之前的部分排序的序列 ”指的是原序列排序吗,还是用排序算法增序排列后钱4个最小值序列

发表于 2018-10-13 11:09:31
0 0
万成

可以构建一个大小为k(k为前k个数)的小顶堆,线性扫描整个序列O(n),如果值小于小顶堆的堆顶元素,则不做处理;如果大于堆顶元素,用这个值替换堆顶元素,并更新小顶堆O(log k),所以复杂度为O(n * log k),接近线性。  

发表于 2018-10-13 11:09:18
0 0
小小精灵

希尔排序( O(n^1.5) 即 O(1000^1.5)  )、快排( O(nlogn) 即 O(1000log1000) )不到最后不能确定顺序。
简单选择排序需要比较n-1、n-2、n-3、...、n-5次。复杂度为O(5n)即 O(5000)
冒泡排序 与简单选择排序相同。
堆排序 O( 1000log5 )  分析如下:
构造包含5个元素的大顶堆。然后将后续的995个元素依次插入大顶堆(插入规则为与堆顶作比较,因为堆顶是当前的堆中的最大元素。若新插入的元素小于堆顶元素则插入,否则该元素不会是最小的5个元素之一,抛弃。)
例如: 1  9   5  3  7   3   8    2   11    23   4  6   一共12个元素。
1) 取前5个元素构造大顶堆:      9
                                                7            5
                                            3     1
2)依次插入3、8、2、11、23、4、6.
插入3 并调整:        7
                            3        5
                        3      1
插入8 ,8>7,抛弃
插入2 并调整:        5
                            3        2
                        3      1
插入11、23 ,均大于5抛弃
插入4 并调整:        4
                            3        2
                        3      1
插入6,6>4 抛弃
3) 最后,对堆内元素再进行排序。
时间复杂度,堆调整过程是O(log5),而整个序列只遍历了一遍,为O(n).
总的复杂度为O(nlog5)

发表于 2022-03-23 12:34:28
1 1
蓝静党 :

终于看到一个详细版啦!真棒

发表于 2022-03-23 12:34:28
回复