面试题:数组寻找第K大的数
思路解析(代码有问题)
1.最暴力的思想,直接排序,然后索引第k个数据,最优的排序算法时间复杂度为O(nlog(n)),但是随着n的变大,复杂度增长
2.借助快速排序的思想
快速排序的思想是通过一趟排序将要排序的list分为2部分,左边小,右边大。然后递归排序左右。我们可以在每一趟排序后,比较基准元素的索引和K的大小,若k大于基准元素的索引,则要寻找的k大数字就在基准元素的右边,否则左边。知道找到基准元素的索引等于K。
时间复杂度 O(n)
1 def partition(data,left,right): 2 if (len(data)<=0 or left<0 or right>=len(data)): 3 print("Invalid parametres,please check!")
#基准元素为list的第一个元素 4 temp = data[left] 5 i = left 6 j = right 7 while (i != j):
#两个指针,先动右边的指针,判断指针指向的元素是否小于基准元素,若小于,就要交换位置,移动到左边 8 while (data[j]>=temp and i<j): 9 j = j-1 10 while (data[i]<=temp and i<j): 11 i = i+1 12 if (i<j):
#data[i]与data[j]位置交换 13 t = data[i] 14 data[j] = data[i] 15 data[j] = t
#当i=j时,这时候list[i]=基准元素 17 data[i] = temp 18 return i 19 20 def find_k(data,k): 21 n = len(data) 22 left = 0 23 right = n-1 24 index = partition(data,left,right) 25 while (index != k): 26 if (index>k): 27 right = index-1 28 index = partition(data,left,right) 29 else: 30 left = index+1 31 index = partition(data,left,right) 32 33 return data[k] 34 35 if __name__ == "__main__": 36 data = [6,9,2,4,5,7,9,3,4] 37 a = 2 38 k = len(data) -a 39 result = find_k(data,k) 40 print(result)

浙公网安备 33010602011771号