分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解。
针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的数,显然这种算法的时间复杂度较大,下面介绍一下分治算法求列表中第k小的数,时间复杂度为O(n).
Blum对于这个问题的解法就是通过找到一个被称为支点的数来对输入序列划分。支点左边的数都比支点数小,支点右边的数都比它大。如果k等于支点数的索引,这是可以立刻返回结果;如果k小于支点数索引,说明第k小的数在支点数左边,需要递归调用函数;如果k大于支点数索引,说明第k小的数在支点数右边,需要递归调用函数。
代码如下:
#寻找第K小的数 def select_fct(array,k): if len(array)<=10:#边界条件 array=sorted(array) return array[k] pivot=get_pivot(array) #得到支点数 array_lt,array_gt,array_eq=patition_array(array,pivot)#按照支点数划分