基本思想
分治法。将数组分成两个小数组,对小数组进行归并排序,在合并两个小数组。
具体实现
def merge(nums, p, q, r):left = [_ for _ in nums[p:q+1]]right = [_ for _ in nums[q+1:r+1]]left_len = q - p + 1right_len = r - qi, j, k = 0, 0, 0while i < left_len and j < right_len:if left[i] < right[j]:nums[p+k] = left[i]i += 1else:nums[p+k] = right[j]j += 1k += 1while i < left_len:nums[p+k] = left[i]i += 1k += 1while j < right_len:nums[p+k] = right[j]j += 1k += 1def _merge_sort(nums, p, r):if p < r:q = (p + r) // 2_merge_sort(nums, p, q)_merge_sort(nums, q+1, r)merge(nums, p, q, r)def merge_sort(nums):length = len(nums)_merge_sort(nums, 0, length-1)
# merge的实现与上面相同def merge_sort(nums: List):length = len(nums)step = 1while step < length:offset = step * 2for i in range(0, length, offset):merge(nums, i, min(length-1, i+step-1), min(length-1, i+offset-1))step *= 2
性能分析
平均时间复杂度:
最坏时间复杂度:
空间复杂度:
