数组的二路归并排序
今天突然想重新写一下 python 排序归并代码,今天重新整理了一下,命名相对以前更加清晰了,给出了完整的测试用例。
对二路归并的排序之前写的文章,感觉实现不是特别好。
二路归并排序Python实现
from typing import List
import random
class Solution:
def sort(self, array: List, left: int, right: int):
if left < right:
mid = left + (right - left) // 2
self.sort(array, left, mid)
self.sort(array, mid + 1, right)
self._merge(array, left, mid, right)
def _merge(self, array, left, mid, right):
"""
在区间 [left,right] 进行merge 操作
:param array:
:param left:
:param mid:
:param right:
:return:
"""
temp = [None] * (right - left + 1)
i = left
j = mid + 1
k = 0
while i <= mid and j <= right:
if array[i] < array[j]:
temp[k] = array[i]
k += 1
i += 1
else:
temp[k] = array[j]
k += 1
j += 1
while i <= mid:
temp[k] = array[i]
k += 1
i += 1
while j <= right:
temp[k] = array[j]
k += 1
j += 1
array[left:right + 1] = temp
if __name__ == '__main__':
cout = 0
array = list(range(1000))
expected = array.copy()
while cout < 1000:
random.shuffle(array)
r = Solution().sort(array, 0, len(array) - 1)
assert array == expected
cout += 1
print(f"curent count={cout}")