一步解决数组的Top K有点困难,不妨逐步解决,先从简单的开始,比如只要找到数组中的最大的一个数可以这样实现:
方法一:
1 | def findLargest(arr, arr_size): |
增大难度,如果需要找到数组中最大的三个数,那又如何实现呢?
方法二:
1 | def find3Largest(arr, arr_size): |
找到最大的3个数也比较简单,那么问题来了,如果要找到最大的K个数,并且K比3要大,比如说10,仍旧用上面的办法就比较不现实。
方法三:冒泡排序变种
还记得冒泡排序吗?每一轮经过两两比较后会产生一个最大的数,如果我们控制外部循环的次数就能找到想要数组中相应最大的K个数,实现如下:
1 | def findKLargest(arr, arr_size, K): |
缺点还是有的,时间复杂度太高了,最坏的情况下有$O(nk)$,所以当数组长度很长的时候肯定是不行的。
方法四:用堆排序(最大堆)
回忆堆排序的过程,堆排序在成功构建了最大堆之后,最后一步是从堆中取出最大的元素,然后再构建最大堆,再取出最大元素,所以我们也可以通过这种方法来实现从数组中找出K个最大元素的目标。构建最大堆的时间复杂度为$O(n)$,从堆中k次取出最大元素的复杂度为$O(klog(n)$。
1 | # Python program for implementation of heap Sort |