1.归并排序
def merge(nums1, nums2):
i = 0
j = 0
res = []
while i < len(nums1) and j < len(nums2):
if nums1[i] > nums2[j]:
res.append(nums2[j])
j += 1
else: # 相等时,先放左边数组的数据,这样才是稳定排序。
res.append(nums1[i])
i += 1
res += nums1[i:]
res += nums2[j:]
return res
def merge_sort(lists):
if len(lists) < 2: # 归并与快排递归结束条件一致
# 拆分到单独一个
return lists
mid = len(lists)//2
left = merge_sort(lists[:mid])
right = merge_sort(lists[mid:])
return merge(left, right)
将一段长文本分到最小格,需要logn,而小格排序则需要n,所以归并时间复杂度为nlogn。
2.快速排序
def quick_sort(arr):
"""快速排序"""
if len(arr) < 2: # 归并与快排递归结束条件一致
# 如果为1,下面的大部分步骤也不会执行
return arr
# 选取基准,随便选哪个都可以,选中间的便于理解
mid = arr[0]
# 定义基准值左右两个数列
left, right = [], []
# 从原始数组中移除基准值
for item in arr[1:]:
# 大于基准值放右边
if item >= mid:
right.append(item)
else:
# 小于基准值放左边
left.append(item)
# 使用迭代进行比较
return quick_sort(left) + [mid] + quick_sort(right)
注意快排的思想和实现方法的区别。
3.归并、快排对比
4.拓展- Top K 问题使用快排思路 O(n) - 重要
q
=
1
/
2
q=1/2
q=1/2,等比数列求和,当n很大的时候,
q
n
q^n
qn相当于木有了,所以最后是2n-1。