算法分析:
将归并排序分为两个过程来分析:分裂和归并。- 分裂的过程,借鉴二分查找中的分析结果,是对数复杂度,时间复杂度是O(log n)
- 归并的过程,相对于分裂的每个部分,其所有数据项都会被比较和放置一次,所以是线性复杂度,其时间复杂度是O(n)
综合考虑,每次分裂都进行一次 O(n)的数据项合并,总的时间复杂度是O(nlog n)
- 使用了额外1倍的存储空间用于归并,这个特性在对特大数据集进行排序的时候要考虑进去。
- 代码中的切片操作,可以改为传递两个分裂部分的起始点和终止点,以减少时间复杂度。
def mergeSort(alist): #递归结束条件 if len(alist) <= 1: return alist #分解问题,并递归调用 middle = len(alist) // 2 left = mergeSort(alist[:middle]) right = mergeSort(alist[middle:]) #合并左右半部,完成排序 merged = [] while left and right: if left[0] <= right[0]: merged.append(left.pop(0)) else: merged.append(right.pop(0)) merged.extend(right if right else left) return merged