# -----------递归---------------
def merge_sort(nums):
if len(nums) <= 1:
return nums
mid = len(nums)//2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
return merge(left, right)
def merge(l1, l2):
i = j = 0
res = []
while i < len(l1) and j < len(l2):
if l1[i] < l2[j]:
res.append(l1[i])
i += 1
else:
res.append(l2[j])
j += 1
if i < len(l1):
res += l1[i:]
if j < len(l2):
res += l2[j:]
return res
#------------非递归-------------------
def merge_sort(nums):
i = 1 #第一次排序的数组规模长度的一半
#建立临时数组,防止占用内存过大
tmp = [0] * len(nums)
while i < len(nums):
low = 0 #初始化
while low < len(nums):
mid = low+i
high = min(low+2*i, len(nums))
if mid < high:
merge(nums, low, mid, high, tmp)
low += 2*i
i *= 2
def merge(nums, low, mid, high, tmp):
i = low
j = mid
k = low #tmp的索引起始位置
while i < mid and j <= high:
if nums[i] < nums[j]:
tmp[k] = nums[i]
k += 1
i += 1
else:
tmp[k] = nums[j]
j += 1
k += 1
# 如果左数组还有剩余
if i < mid:
tmp[k:high+1] = nums[i:mid]
# 如果右数组还有剩余
if j <= high:
tmp[k:high+1] = nums[j:high+1]
# 排好序的部分替换掉原来的乱序
nums[low:high+1] = tmp[low:high+1]
#非递归,另一种写法
def merge_sort1(nums):
length = len(nums)
interval = 2
i = 0
while interval < length:
for i in range(0, length, interval):
nums[i:i+interval] = merge(nums[i:i+interval//2], nums[i+interval//2:i+interval])
interval *= 2
return nums
def merge(left, right):
res = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
res.append(left[i])
i += 1
else:
res.append(right[j])
j += 1
res += left[i:]
res += right[j:]
return res
nums = [3,1,4,4,6,5,8]
merge_sort(nums)