1、问题描述:排序算法中归并排序是于1945年由冯·诺伊曼首次提出,可以通过递归实现和非递归实现,本次采用递归实现。递归实现的归并排序是算法设计中分治策略的典型应用。
2、性能分析:
最差时间复杂度为:O(nlogn)
最优时间复杂度为:O(nlogn)
平均时间复杂度为:O(nlogn)
所需辅助空间为:O(n)
稳定性:稳定
3、代码
def merge_sort(a):
if len(a) <= 1:
return a
mid = len(a)//2
left = merge_sort(a[:mid])
right = merge_sort(a[mid:])
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
if i == len(left):
res.extend(right[j:])
else:
res.extend(left[i:])
return res
重新学习了下,更新第二种方法
这次的算法思路可以用三国里面最经典的一句话来描述:合久必分,分久必合
def merge_sort(a, left, right):
if left < right:
mid = (left+right) // 2
merge_sort(a, left, mid)
merge_sort(a, mid+1, right)
merge(a, left, mid, right)
def merge(a, left, mid, right):
b = [0]*len(a)
for i in range(len(a)):
b[i] = a[i]
i = left
j = mid+1
k = i
while i <= mid and j <= right:
if b[i] <= b[j]:
a[k] = b[i]
i += 1
else:
a[k] = b[j]
j += 1
k += 1
while i <= mid:
a[k] = b[i]
k += 1
i += 1
while j <= right:
a[k] = b[j]
k += 1
j += 1
a = [3,6,7,2,5,1,4]
merge_sort(a, 0, len(a)-1)
print(a)