题目描述:输入n个整数,输出其中最大的k个。
举例:输入序列1、2、3、4、5、6、7、8,输出最大的4个数字为5、6、7、8。
可能存在的条件限制:
要求 时间 和 空间消耗最小、海量数据、待排序的数据可能是浮点数等
方法一:对所有元素进行排序,之后取出前K个元素,不提倡使用
思路:使用最快排序算法,选择快排 或 堆排
时间复杂度:O(n*logn) + O(K) = O(n*logn)
特点:需要对全部元素进行排序,K = 1 时,时间复杂度也为O(n*logn)
注意:题中只需得到最大的K个数,而不需要对后面N-K个数排序
方法二:只需要对前K个元素排序,不需要对N-K个元素进行排序,不提倡使用
思路:使用 选择排序 或 起泡排序,进行K次选择,可得到第k大的数
时间复杂度:O(n*k)
方法三:不对前K个数进行排序 + 不对N-k个数排序,可以使用
思路:寻找第K个大元素。
具体方法:使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求
在数组S中^^随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。
这时有两种情况:
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。
寻找最大的k个数:高效算法解析

本文探讨了寻找给定整数序列中最大的k个数的各种算法,包括排序、选择排序、快速排序的变种、计数排序、基数排序、二分查找和堆排序。强调了时间复杂度和空间复杂度的重要性,并推荐了维护大小为k的小根堆的方法,以在O(n*log2 k)的时间复杂度和O(k)的空间复杂度下解决问题。同时,还涉及了处理浮点数、不同范围的k和m,以及在权重不断更新的搜索引擎场景下的优化策略。
最低0.47元/天 解锁文章
172万+

被折叠的 条评论
为什么被折叠?



