归并排序算法

本文深入探讨了归并排序算法,这是一种基于分治思想的排序方法。它将大问题分解为小问题,通过递归地排序和合并子数组来达到整体排序的目的。归并排序的时间复杂度为O(nlogn)。文中还提供了详细的算法实现,包括如何将已排序的子数组合并成最终的有序数组。通过对数组的不断划分和合并,实现了高效的排序效果。
摘要由CSDN通过智能技术生成

算法思想

参考:归并排序
归并排序是用到了分治的思想,分治的思想是将一个大问题拆分成很多的小问题,然后再将已经处理完成的小问题合并成整个的大问题。在这个过程中,大问题就得到了解决。在大数据方面的 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值