归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表。
流程
# 如数据 [1,5,3,7,2,6,4,8]# 开始分割:"""[1,5,3,7] | [2,6,4,8][1,5]|[3,7] | [2,6] | [4,8][1] | [5] | [3] | [7] | [2] | [6] | [4] | [8]开始合并:[1,5] [3,7] [2,6] [4,8][1,3,5,7] [2,4,6,8][1,2,3,4,5,6,7,8]"""
代码实现
class MergeSort:"""如数据 [1,5,3,7,2,6,4,8]开始分割:[1,5,3,7] | [2,6,4,8][1,5]|[3,7] | [2,6] | [4,8][1] | [5] | [3] | [7] | [2] | [6] | [4] | [8]开始合并:[1,5] [3,7] [2,6] [4,8][1,3,5,7] [2,4,6,8][1,2,3,4,5,6,7,8]"""def __init__(self, data: list):self.data = data# self.sort_data = []def sort(self):self.data = self.__merge_sort(self.data)def __merge_sort(self,data:list):"""归并排序"""print(f"分割数组 {data}")# 优化点 如果当数组中的元素达到指定大小就可以使用其他排序方式直接进行排序if len(data) == 1:return data# if len(data) == 3:# print("---")# return insert_sort(data)# elif len(data)==1:# return data# 使用二分法将数列分两个mid = len(data) // 2left = data[:mid]right = data[mid:]# 使用递归运算return self.marge(self.__merge_sort(left), self.__merge_sort(right))def marge(self, left: list, right: list):"""排序合并两个数列"""print(f"合并数据 {left} {right}")result = []# 优化 如果当存在两数组中第一个值比另一个最后的值小,不用再行比较if len(left) > 0 and len(right) and left[-1] < right[0]:result = left + rightelif len(left) > 0 and len(right) and left[0] > right[-1]:result = right + leftelse:while len(left) > 0 and len(right) > 0:# 左右第一个开始做比较if left[0] <= right[0]:result.append(left.pop(0))else:result.append(right.pop(0))# 只有一个数列中还有值,直接添加result += leftresult += rightreturn resultdef datas(self):return self.data
时间复杂度分析
O(nlogn),如果数据是近乎有序的,则时间复杂度变成O(n),因为有序的数据中merge的过程不会进行
