要理解快排,可参考https://www.cnblogs.com/MOBIN/p/4681369.html,此处只有代码。
快速排序
复杂度分析:https://www.cnblogs.com/MOBIN/p/4681369.html
算法分析:
1.当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏的情况,时间复杂度和直接插入排序的一样,移动次数达到最大值
Cmax = 1+2+…+(n-1) = n*(n-1)/2 = O( n 2 n^2 n2) 。此时最好时间复杂为O( n 2 n^2 n2)
2.当分区选取的基准元素为待排序元素中的"中值",为最好的情况,时间复杂度为O( n l o g 2 n nlog_2n nlog2n)。
3.快速排序的空间复杂度为O( l o g 2 n log_2n log2n).
4.当待排序元素类似[6,1,3,7,3]且基准元素为6时,经过分区,形成[1,3,3,6,7],两个3的相对位置发生了改变,所是快速排序是一种不稳定排序。
PYTHON3
def quickSort(nums, start, end):
if start < end:
l, r = start, end
temp = nums[l]
while l < r:
while (l < r) and (nums[r] >= temp):
r -= 1
nums[l] = nums[r]
while (l < r) and (nums[l] <= temp):
l += 1
nums[r] = nums[l]
nums[l] = temp
partition(nums, start, l-1)
partition(nums, l+1, end)
快速选择
Leetcode 215. 数组中的第K个最大元素
输出数组中第K大的值。
算法复杂度 O(n) < O < O( n 2 n^2 n2)
#首先要明确,此题目求的是 第K个最大元素,就是说将数据进行从小到大排序,倒数第K个元素。
class Solution:
def partition(self, nums, left, right): #一次排序
temp = nums[left]
while left < right:
while (left < right) and (nums[right] >= temp):
right -= 1
nums[left] = nums[right]
while (left < right) and (nums[left] <= temp):
left += 1
nums[right] = nums[left]
nums[left] = temp
return left #left左边的数字比left小
def findKthLargest(self, nums: List[int], k: int) -> int:
return self.select(nums, 0, len(nums)-1, k)
def select(self, nums, left, right, k):
p = self.partition(nums, left, right)
m = right - p + 1
if m == k :
return nums[p]
if k > m: #此元素在左边
return self.select(nums, left, p-1, k-m)
else: #此元素在右边
return self.select(nums, p+1, right, k)