1.概念
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
2.步骤
- 将一个序列从中间位置分成两个序列;
- 在将这两个子序列按照第一步继续二分下去;
- 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列。
上图:
3.python代码实现
def merge(a, b):
c = []
h = j = 0
while j < len(a) and h < len(b):
if a[j] < b[h]:
c.append(a[j])
j += 1
else:
c.append(b[h])
h += 1
if j == len(a):
for i in b[h:]:
c.append(i)
else:
for i in a[j:]:
c.append(i)
return c
def merge_sort(s):
if len(s) <= 1:
return s
middle = len(s)//2
left = merge_sort(s[:middle])
right = merge_sort(s[middle:])
return merge(left, right)
if __name__ == '__main__':
s=[2,8,9,1,3]
print (merge_sort(s))
4.算法描述
时间复杂度
当有n个记录时,需进行⌈logn⌉轮归并排序,每一轮归并,其估计值比较次数不超过n,元素移动次数都是n,因此,归并排序的时间复杂度为O(nlogn)。
空间复杂度
用容器实现归并排序时,需要和待排序记录个数相等的存储空间,所以空间复杂度为O(n)。
该算法是稳定排序。