算法思想
参考:归并排序
归并排序是用到了分治的思想,分治的思想是将一个大问题拆分成很多的小问题,然后再将已经处理完成的小问题合并成整个的大问题。在这个过程中,大问题就得到了解决。在大数据方面的 Map-Reduce 就是这样的分治的思想。
归并排序首先将数组等分,然后排序等分后的数组,最后再将排好序的两个数组合并成一个排好序的数组。归并排序的时间复杂度是O(n log n)
算法实现
'''
归并排序
'''
def mergeSort(self, array):
n = len(array)
if n <= 1:
return array
midIndex = n // 2
# 左边的部分做mergeSort,各自变为有序数组
leftArray = self.mergeSort(array[:midIndex])
# 右边的部分做mergerSort
rightArray = self.mergeSort(array[midIndex:])
# 将两部分合并,成为一个新的数组,并已经是排好序的
# 定义一个返回列表(这一步代表空间复杂度至少为O(n))
result = []
# 需要定义两个指针,这两个指针分别指向两个数组的第一个元素
leftPointer, rightPointer = 0, 0
# 获取两个数组的长度,用于指出上面两个指针的边界是什么
leftLen = len(leftArray)
rightLen = len(rightArray)
# 两个数组都有值就一直比较合并,有任意一个为空时,跳出循环
while leftPointer < leftLen and rightPointer < rightLen:
# 依次比较两个数组的值,将小的加到返回列表中,
# 并且该数组的指针向前移动一位
if leftArray[leftPointer] < rightArray[rightPointer]:
result.append(leftArray[leftPointer])
leftPointer += 1
else:
result.append(rightArray[rightPointer])
rightPointer += 1
# 有任意一个数组为空了,跳出循环后
# 判断那个数组不为空,不为空的数组的剩余部分全部添加到返回列表中
if leftPointer < leftLen:
result += leftArray[leftPointer:]
if rightPointer < rightLen:
result += rightArray[rightPointer:]
return result