1. 排序 全局排序时间复杂度O(nlog(n))
2. 局部排序:冒泡排序 保证了前k个最大数是有序的 时间复杂度O(n*k)
3. 可以不关心前k个数是否有序 堆排 时间复杂度 O(nlog(k)) 堆是经典的求topk的算法
4. 随机选择,基于快速排序,快速排序的核心是:i = partition(arr, low, high),其中i返回的是(初始化元素t = arr[0])的位置,[0,i-1]是比t大的,右边[i+1,n-1]是比t小的元素。时间复杂度O(n)
i = partition(arr, 1, n);
-
如果i大于k,则说明arr[i]左边的元素都大于k,于是只递归arr[0, i-1]里第k大的元素即可;
-
如果i小于k,则说明说明第k大的元素在arr[i]的右边,于是只递归arr[i+1, n-1]里第k-i大的元素即可;
具体的可参考 https://blog.csdn.net/suibianshen2012/article/details/52003082