42
42
### 递归实现
43
43
44
44
``` python
45
- def merge_sort (array : List) -> List:
45
+ def merge_sort (array : List, reverse : bool = False ) -> List:
46
46
'''
47
47
支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
48
+ reverse: 是否降序, 默认采用升序。
48
49
'''
49
50
if len (array) <= 1 :
50
51
return array
51
52
mid = len (array) // 2
52
53
left = merge_sort(array[:mid])
53
54
right = merge_sort(array[mid:])
54
- return merge(left, right)
55
+ return merge(left, right, reverse = reverse )
55
56
56
- def merge (l : int , r : int ) -> List:
57
+ def merge (l : int , r : int , reverse : bool = False ) -> List:
57
58
'''
58
59
l: 数据左侧游标(整型), r: 数据右侧游标(整型)
59
60
'''
60
61
result = []
61
62
i = 0
62
63
j = 0
63
64
while i < len (l) and j < len (r):
64
- if ( l[i] <= r[j]) :
65
+ if l[i] > r[j] if reverse else l[i] <= r[j]:
65
66
result.append(l[i])
66
67
i += 1
67
68
else :
@@ -75,7 +76,7 @@ def merge(l: int, r: int) -> List:
75
76
### 非递归实现
76
77
77
78
``` python
78
- def merge (array : List, low : int , mid : int , high : int ) -> None :
79
+ def merge (array : List, low : int , mid : int , high : int , reverse : bool = False ) -> None :
79
80
'''
80
81
low: 数据低侧游标(整型), mid: 数据中间游标(整型), high: 数据高侧游标(整型)
81
82
'''
@@ -85,7 +86,7 @@ def merge(array: List, low: int, mid: int, high: int) -> None:
85
86
j = 0
86
87
result = []
87
88
while i < len (left) and j < len (right):
88
- if left[i] <= right[j]:
89
+ if left[i] > right[j] if reverse else left[i] <= right[j]:
89
90
result.append(left[i])
90
91
i += 1
91
92
else :
@@ -95,9 +96,10 @@ def merge(array: List, low: int, mid: int, high: int) -> None:
95
96
result += right[j:]
96
97
array[low: high] = result
97
98
98
- def merge_sort (array : List) -> None :
99
+ def merge_sort (array : List, reverse : bool = False ) -> None :
99
100
'''
100
101
支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
102
+ reverse: 是否降序, 默认采用升序。
101
103
'''
102
104
i = 1
103
105
while i < len (array):
@@ -106,7 +108,7 @@ def merge_sort(array: List) -> None:
106
108
mid = low + i
107
109
high = min (low + 2 * i, len (array))
108
110
if mid < high:
109
- merge(array, low, mid, high)
111
+ merge(array, low, mid, high, reverse = reverse )
110
112
low += 2 * i
111
113
i *= 2
112
114
```
0 commit comments