思路:
1.对数组S进行拆分,从数组S中随机找出一个元素,将数组分成大于该元素和小于该元素的Sa和Sb。
2.当Sa中元素的个数大于或等于K,那么Sa中最大的K个元素就是数组S的最大的K个元素;
当Sa中元素的个数小于K,那么数组S的最大的K个元素则为Sa中所有的数和Sb中的K-length(Sa)个元素。
这样递归下去,可将问题分解成更小的问题,平均时间复杂度为o(N*log2k)。
3.应该注意一个问题,如果数组中有数值相同的数的情况。将随机找出的元素放到数组的最前面,方便后面处理。当遇到相同的值时,为了避免递归无法停止的情况,必须将相同的值分别分布在Sa和Sb中,我选择了将该元素放在Sb中,在遍历数组剩下的元素时,会将和该元素相等的元素放在Sa中,这样循环下去,就可以跳出递归。也可以直接不要和该元素相等的元素。
代码:
import random
def partition(s):
sa = []
sb = []
temp = random.randint(0,len(s)-1)
s[0],s[temp] = s[temp],s[0]
p = s[0]