python3暴力解法+常规解法
寻找第K大
http://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf
先进行快速排序得到有序序列,返回下标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)