一,什么是topK问题?
一组数据中,需要找出前k大(小)的数据
二,思路分析:以前k小为例
思路1:先排序再输出
如果是完全有序,那么输出所求数据很简答了(需要排序,将数据完全排序)
思路2:基于快排,分片,不完全排序
使用快排思想,不断分片,左侧是比基准小的元素,右侧是比基准大的元素,
令 index=基准元素下标
a, index<k 说明第k小元素在index右侧,在index右侧寻找新的基数,直到基数的下标index==k
b,index==k 说明第k小元素就是基准元素
c,index>k 说明第k小元素在index左侧,在index左侧寻找新的基数,直到基数的下标index==k
三.另一种思路
数组长度为n,需要找出topk 小
那么将数组分为两部分
result=[0,k-1],
search=[k-1,n]
将result中的元素挨个与search中比较,如果result小于serch,数据交换
时间复杂度:
k*(n-k)
三,实现 java代码实现:
public static int topK(int [] array,int k) throws Exception {
if(null