其实不一定需要排序,采用类似快排的想法,随机挑选划分成三堆:比P小的、P、大等于P的。然后判断P在当前子序列中的位置距离,其右侧有几个比它大的: k-1个比它大的,返回P即可; 比k-1个少,在左侧序列中到k-1-offset个即可。offset是当前比P大的个数。 比k-1个多,迭代右侧序列。 (详见代码,复杂度O(NlogN)) def find_k(arr, k): def split(low, high, k=0): if low >= high: return arr[low] i, j, p = low, h...