【python】归并排序

归并排序本质思想是二分法,采用分而治之的思路进行排序。

当拿到一个数组时,不断从中间进行拆分为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)

猜你喜欢

转载自www.cnblogs.com/shoa/p/9257505.html