合并排序算法
合并排序是利用分治算法实现的,利用分治算法解决问题需要明确以下三个问题:
- 递归函数的返回值:返回对待排列表的排序结果;
- 基线条件:列表(待排序列表)规模 l e n ( a r r ) < = 1 len(arr) <= 1 len(arr)<=1;
- 递归条件,缩小问题规模:把列表均分为左右两部分,分别进行排序、返回排序结果,然后对结果进行合并,并返回合并结果;
合并排序算法示意图:
合并排序的耗时操作主要是合并排序,合并排序的层数为:
l
o
g
n
logn
logn,每层的合并操作为:
n
n
n。所以,合并排序的时间复杂度为:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
上办部分可以为拆分的过程,下半部分为合并的过程。
合并排序算法代码如下:
#!/bin/bash
def merge(left, right):
mergeArr = []
leftIndex = rightIndex = 0
while leftIndex < len(left) and rightIndex < len(right):
if left[leftIndex] <= right[rightIndex]:
mergeArr.append(left[leftIndex])
leftIndex += 1
else:
mergeArr.append(right[rightIndex])
rightIndex += 1
if leftIndex < len(left):
mergeArr.extend(left[leftIndex:])
elif rightIndex < len(right):
mergeArr.extend(right[rightIndex:])
return mergeArr
def merge_sort(lists):
if len(lists) <= 1:
return lists
middle = len(lists) // 2
left = merge_sort(lists[:middle])
right = merge_sort(lists[middle:])
return merge(left, right)
arr = [1, 5, 9, 6, 8, 7, 5, 3, 4, 9]
print(merge_sort(arr))
结果:`[1, 3, 4, 5, 5, 6, 7, 8, 9, 9]`
程序的执行顺序为:
参考资料
- 有参考网络资料,地址已不可察;