归并排序本质思想是二分法,采用分而治之的思路进行排序。
当拿到一个数组时,不断从中间进行拆分为left、right数组,当数组长度为1,不可拆分,进而将左右数组进行合并。
例如,给定 nums = [ 6, 4, 5, 2, 1, 3 ]
拆分过程如下:
第一步拆分: 6,4,5 2,1,3
第二步拆分: 6 4,5 2 1,3
第三步拆分: 6 4 5 2 1 3
合并过程如下:
第一步合并: 6 4,5 2 1,3
第二步合并: 4,5,6 1,2,3
第三步合并: 1,2,3,4,5,6
代码实现如下:
1 def mergesort(nums): 2 n = len(nums) 3 if n <= 1: 4 return nums 5 mid = n//2 6 left = mergesort(nums[:mid]) 7 right = mergesort(nums[mid:]) 8 print("left", left) 9 print("right", right) 10 result = [] 11 l, r = 0, 0 12 while l<len(left) and r<len(right): 13 if left[l]<=right[r]: 14 result.append(left[l]) 15 l += 1 16 else: 17 result.append(right[r]) 18 r += 1 19 result += left[l:] 20 result += right[r:] 21 return result 22 nums = [6,4,5,2,1,3] 23 mergesort(nums)
最近看到可以用归并排序来统计数组的逆序对个数,在合并时,统计逆序对个数。
代码实现如下:
1 global count 2 count = 0 3 def mergesort(nums): 4 global count 5 if len(nums) <= 1: 6 return nums 7 m = len(nums) 8 mid = m//2 9 left = mergesort(nums[:mid]) 10 right = mergesort(nums[mid:]) 11 l, r = 0, 0 12 res = [] 13 while l<len(left) and r<len(right): 14 if left[l] <= right[r]: 15 res.append(left[l]) 16 l += 1 17 else: 18 res.append(right[r]) 19 r += 1 20 count += len(left)-l #统计逆序对个数 21 res += left[l:] 22 res += right[r:] 23 return res 24 nums = [6,4,5,2,1,3] 25 mergesort(nums)