归并排序( Merge sort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
1.算法描述:
- 分而治之
- 分 :
- 递归地拆分数组,直到它被分成两对单个元素数组为止.
- 然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并, 直到整个列表按照排序顺序合并为止.
- 治 :
- 将2个排序列表合并为另一个排序列表是很简单的.
- 简单地通过比较每个列表的头,删除最小的,以加入新排序的列表.
- O(n) 操作
2.算法属性:
- 稳定
- 算法时间复杂度:O(nlogn)
3.代码实现
#算法时间复杂度 O(logN) #递归 #两个步骤:1.拆分 2.合并 def _merge(a: list, b: list) -> list: #合并两个排序表 c = [] while len(a) > 0 and len(b) > 0: if a[0] < b[0]: c.append(a[0]) a.remove(a[0]) else: c.append(b[0]) b.remove(b[0]) if len(a) == 0: c += b else: c += a return c def _merge_sorted(nums: list) -> list: # Won't sort in place if len(nums) <= 1: return nums m = len(nums) // 2 a = _merge_sorted(nums[:m]) #前半 b = _merge_sorted(nums[m:]) #后半 return _merge(a, b) # Wrapper包装器 def merge_sorted(nums: list, reverse=False) -> list: import time start = time.time() #归并排序 nums = _merge_sorted(nums) if reverse: nums = nums[::-1] t = time.time() - start return nums, len(nums), t lis = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] merge_sorted(l, reverse=False)[0] #输出结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]