博客代码是博主想复习下排序算法然后手打的,已经过调试。若还有错误请指出!
一、归并排序
算法思想:
该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,
而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
分阶段可以理解为就是递归拆分子序列的过程,递归深度为logn
平均 最坏 最好 空间 稳定性 复杂性
O(nlogn) O(nlogn) O(nlogn) O(n) 稳定 较复杂
对于冒泡排序和选择排序,每一趟都能确定一个元素的最终位置
归并排序,第一趟排序结束都可以得到若干个有序子序列,而此时的序列中并没有两两元素有序排列。
插入排序在每趟排序后能确定前面的若干元素是有序的,而此时第二趟排序后,序列的前三个元素是有序的,符合其特征。
算法稳定性
在归并排序中,相等的元素的顺序不会改变,所以它是稳定的算法。
Python代码
def merge(left_list, right_list):
left = 0
right = 0
result = []
while left < len(left_list) and right < len(right_list):
if left_list[left] <= right_list[right]:
result.append(left_list[left])
left += 1
else:
result.append(right_list[right])
right += 1
result += left_list[left:]
result += right_list[right:]
return result
def merge_sort(input_list):
if len(input_list) <= 1:
return input_list
mid = len(input_list) // 2
left_list = merge_sort(input_list[:mid])
right_list = merge_sort(input_list[mid:])
return merge(left_list, right_list)
'''