先进行快速排序得到有序序列,返回下标n-k即可
-- coding:utf-8 --
class Finder:
def findKth(self, a, n, K):
if n<=1:
return a[0]
a=self.fast_sort(a, 0, n-1, K)
return a[n-K]
def fast_sort(self,a,first,last,k):
#递归最终退出条件
if first>=last:
return
low=first
high=last
temp=a[first]
while low<high:
#从后往前找,找到一个就交换
while a[high]>=temp and low<high:
high-=1
a[low]=a[high]
#从前往后找,找到一个就交换
while a[low]<temp and low<high:
low+=1
a[high]=a[low]
#将参考值放到中间,此时low=high
a[low]=temp
#递归遍历标准值右边子序列
self.fast_sort(a, low+1, last, k)
#递归遍历标准值左边子序列
self.fast_sort(a, first, low, k)
return a常规解法:半快速排序+递归
每一次二分排序结束,此时游标值为low,有序序列长度为n,
n-low=k:返回a[low]
n-low>k:递归遍历右边序列
n-low<k:递归遍历左边序列
-- coding:utf-8 --
class Finder:
def findKth(self, a, n, K):
return self.fast_sort(a, 0, n-1, n,K) if n>1 else a[0]
def fast_sort(self,a,first,last,n,k):
low=first
high=last
temp=a[first]
while low<high:
#从后往前找,找到一个就交换
while a[high]>=temp and low<high:
high-=1
a[low]=a[high]
#从前往后找,找到一个就交换
while a[low]<temp and low<high:
low+=1
a[high]=a[low]
#将参考值放到中间,此时low=high
a[low]=temp
if n-low==k:
return temp
#递归遍历标准值右边子序列
elif n-low>k:
return self.fast_sort(a, low+1, last,n, k)
#递归遍历标准值左边子序列
else:
return self.fast_sort(a, first, low,n, k)


京公网安备 11010502036488号