快排的平均时间复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),最坏情况下的时间复杂度是
O
(
n
2
)
O(n^2)
O(n2),且是一种不稳定的排序方法。
python代码(快排实现):
classSolution:deffindKthLargest(self, nums, k):# 快排
self._k =len(nums)- k
return self.quicksort(nums,0,len(nums)-1)defquicksort(self, nums, left, right):if left == right:return nums[left]
pivot = self.partition(nums, left, right)if pivot == self._k:return nums[pivot]elif pivot < self._k:return self.quicksort(nums, pivot +1, right)else:return self.quicksort(nums, left, pivot -1)defpartition(self, nums, left, right):
pivot = nums[left]
i, j = left, right
while i < j:while i < j and nums[j]>= pivot:
j -=1if i < j:
nums[i]= nums[j]
i +=1while i < j and nums[i]<= pivot:
i +=1if i < j:
nums[j]= nums[i]
j -=1
nums[i]= pivot
return i
堆排序
构建二叉堆,也就是把一个无序的完全二叉树调整为二叉堆,本质上就是让所有非叶子节点依次下沉。
复杂度:假设二叉堆总共有n个元素,那么向下调整的最坏时间复杂度就等同于二叉堆的高度,也就是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
python代码(堆排序实现)
classSolution:deffindKthLargest(self, nums, k):# 堆排
self._k =len(nums)- k
return self.heapsort(nums)defheapsort(self, nums):
self.build_heap(nums)for i inrange(len(nums)-1, self._k -1,-1):
nums[i], nums[0]= nums[0], nums[i]# 这里要排除最后一个元素
self.max_heapify(nums,0, i)return nums[self._k]defbuild_heap(self, nums):
length =len(nums)for i inrange(((length -1)//2),-1,-1):# 从最后一个节点的父节点开始向上调整
self.max_heapify(nums, i, length)defmax_heapify(self, nums, i, length):
left = i *2+1
right = i *2+2if left < length and nums[left]> nums[i]:
largest = left
else:
largest = i
if right < length and nums[right]> nums[largest]:
largest = right
if largest != i:
nums[i], nums[largest]= nums[largest], nums[i]# 子树也要调整
self.max_heapify(nums, largest, length)
题目:数组中的第K个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。思路:方法1:最简单的方法就是调用排序的库函数,对数组的元素先进行排序,然后找出第K个最大值(当然这个方法很简单,无法