基础算法篇之并归排序
每日一个算法之并归排序
1 并归排序的原理可以结合图形来看,大致的思想是先分后并,先将大的数组按照中间分组,之后将分开后的左右数组继续分组,直到分开的数组只有一个,之后再将小的数组比较大小,交换位置合并,直到合并成之前的数组
1 从第一行到第三行很好理解,就是分的过程,不断的对数组进行中分,直到分到最小粒度,不能再进行分割了为止
2 第一阶段结束之后,进入第二阶段,对已经分割的数据进行合并,此时比较方法是这样的,分别对左边右边定义一个指针,然后创建一个空列表,比较左右数组的当前指针大小,小的就加入空列表里面
并且之后指针往后前进一个,直到左右其中一个数组被遍历完,将另一个数组的所有值加入result,完成一次合并,之后持续递归直到所有的数组递归结束,完成排序
2 代码实现
#!/usr/bin/env python
# -*- coding:utf-8 -*- # 并归排序 def mergeSort(list): listLength = len(list) if listLength <= 1:
# 定义分的结束条件 return list mid = listLength // 2 leftList = mergeSort(list[:mid]) rightList = mergeSort(list[mid:]) leftPoint = rightPoint = 0
# 归逻辑 result = []
# 每一次归运算 while leftPoint < len(leftList) and rightPoint < len(rightList): if leftList[leftPoint] < rightList[rightPoint]: result.append(leftList[leftPoint]) leftPoint += 1 else: result.append(rightList[rightPoint]) rightPoint += 1
# 当其中一个遍历完之后将另外一个也加入里面
result += leftList[leftPoint:] result += rightList[rightPoint:]
# 记录每次合的result print(result) return result if __name__ == '__main__': mergeSort([1, 4, 3, 5, 2, 7, 6, 8])
3 执行过程