堆排序 (๑• . •๑)
|
|
Python中的堆排序
heapq模块实现了Python中的堆排序,并提供了有关方法。让用Python实现排序算法有了简单快捷的方式。
heapq的官方文档和源码:Heap queue algorithm
下面通过举例的方式说明heapq的应用方法
实现堆排序
|
|
Output: [1, 2, 3, 4, 5, 9, 88, 123]
下面说说几个主要方法
heappush()
heapq.heappush(heap, item):将item压入到堆数组heap中。如果不进行此步操作,后面的heappop()失效
heappop()
heapq.heappop(heap):从堆数组heap中取出最小的值,并返回。
|
|
heapq.heappushpop(heap, item)
是上述heappush和heappop的合体,同时完成两者的功能.注意:相当于先操作了heappush(heap,item),然后操作heappop(heap)
|
|
heapq.heapify(x)
x必须是list,此函数将list变成堆,实时操作。从而能够在任何情况下使用堆的函数。
|
|
heapq.heapreplace(heap, item)
是heappop(heap)和heappush(heap,item)的联合操作。注意,与heappushpop(heap,item)的区别在于,顺序不同,这里是先进行删除,后压入堆
|
|
heapq.merge(*iterables)
举例:
>>> a = [2, 4, 6]
>>> b = [1, 3, 5]
>>> c = merge(a, b)
>>> list(c)
[1, 2, 3, 4, 5, 6]
在归并排序中详细演示了本函数的使用方法。
heapq.nlargest(n, iterable[, key]),heapq.nsmallest(n, iterable[, key])
获取列表中最大、最小的几个值。
>>> a
[2, 4, 6]
>>> nlargest(2,a)
[6, 4]
数组中的第K个最大元素
其实以上说了那么多,只是为了说这道题。
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
|
|
示例 2:
|
|
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
这里不说别的解法。当然面试中你肯定不能这么写,但这是一个很好的思路
|
|
看到有人用return sorted(nums)[-k]
,真的要被气死了。