算法介绍
归并排序,也叫合并排序,中心思想是将已排好序的两个或两个以上(常为两个)数列,合并成一个大的排序数列。为了保证这两个数列是已经排好序的,需要将数列对半分,直到该数列中只包含一个数字。
视频演示
视频地址:https://www.bilibili.com/video/av18980253
python 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
def merge(left_data, right_data): merge_data = [] L = len(left_data) R = len(right_data) i = 0 j = 0 while i<L and j<R: if left_data[i] < right_data[j]: merge_data.append(left_data[i]) i += 1 else: merge_data.append(right_data[j]) j += 1
if i<L: assert j>=R merge_data.extend(left_data[i:]) else: merge_data.extend(right_data[j:]) return merge_data
def merge_sort(data): n = len(data) if n<=1: return data else: middle = int(n//2) left_data = merge_sort(data[:middle]) right_data = merge_sort(data[middle:]) merge_data = merge(left_data, right_data) return merge_data
if __name__ == '__main__': data = [38, 27, 43, 3, 9, 82, 10] sorted_data = merge_sort(data.copy()) print("排序前:", data) print("排序后:", sorted_data)
|
算法分析
归并排序需要递归切分 logn 次,时间复杂度为 O(nlogn)
归并排序空间复杂度跟实现方法有关系,最小为O(1),最大为O(nlogn)