python归并排序、快速排序

归并排序(Merge Sort)

归并排序把数组从中间分成前后两部分,重复拆分直至最小粒度,然后对前后两部分分别排序,再把排序好的两部分合并在一起.
递推公式:merge_sort(start, end)=merge(merge_sort(start, mid), merge_sort(mid+1, end))
终止条件:start >= end

def merge_sort(array, start, end):
    """终止条件"""
    if start >= end:
        return
    mid = int((start+end)/2)
    #递推公式
    merge_sort(array, start, mid)
    merge_sort(array, mid+1, end)
    merge(array, start, mid, end)


def merge(array, start, mid, end):
    temp = []
    p1 = start
    p2 = mid+1
    while p1 <= mid and p2 <= end:
        if array[p1] <= array[p2]:
            temp.append(array[p1])
            p1 += 1
        else:
            temp.append(array[p2])
            p2 += 1
    while p1 <= mid:
        temp.append(array[p1])
        p1 += 1
    while p2 <= end:
        temp.append(array[p2])
        p2 += 1

    for i in range(0,len(temp)):
        array[i+start] = temp[i]


if __name__ == '__main__':
    a = [2, 5, 3, 6, 1, 4]
    b = [1, 2, 3, 4, 5, 6]
    merge_sort(a, 0, len(a)-1)
    merge_sort(b, 0, len(b)-1)
    print(a)
    print(b)

快速排序(Quick Sort)

快排在数组中选择任意一个下标点作为pivot(分区点),遍历start到end之间的数据,
将小于pivot的放左边,将大于pivot的放右边,再重复处理小于区和大于区,直至满足终止条件
递推公式:quick_sort(start, end) = quick_sort(start, pivot-1) + quick_sort(pivot+1, end)
终止条件:start >= end

def quick_sort(array, start, end):
    if start >= end:
        return
    pivot = partition(array, start, end)
    quick_sort(array, start, pivot-1)
    quick_sort(array, pivot+1, end)


def partition(array, start, end):
    pivot = array[start]
    left = start
    right = end
    while left < right:
        while left < right and array[right] > pivot:
            right -= 1
        while left < right and array[left] <= pivot:
            left += 1
        if left < right:
            array[left], array[right] = array[right], array[left]
    array[start] = array[left]
    array[left] = pivot
    return left


if __name__ == '__main__':
    a = [2, 5, 3, 6, 1, 4]
    b = [1, 2, 3, 4, 5, 6]
    quick_sort(a, 0, len(a)-1)
    quick_sort(b, 0, len(b)-1)
    print(a)
    print(b)

图解,复杂度、稳定性

平均时间复杂度最坏时间复杂度空间复杂度原地排序稳定排序
归并排序(Merge Sort)O(nlogn)O(n²)O(n)
快速排序(Quick Sort)O(nlogn)O(n²)O(1)

递归排序和快速排序都是是分治思想(分而治之,将大问题分解成小的子问题,小的子问题解决了,大的问题也就解决了),
递归排序是由上到下,再由下到上,先分解为最小粒度,再由下到上,依次处理子问题,合并
快速排序是由上到下,先分区再处理子问题

在这里插入图片描述

在这里插入图片描述

<think>好的,我现在需要帮助用户找到用Python实现归并排序的示例代码。首先,用户提供了几个引用,我需要先查看这些引用内容,看看是否有相关的代码示例。 引用[1]提到了归并排序,并给出了一个Python实现的代码。看起来这个代码包括merge_sort和merge两个函数,递归地将数组分成左右两部分,然后合并。示例代码还展示了如何使用这个函数进行排序,并输出结果。这应该是一个可行的示例。 引用[2]也提供了类似的代码,结构上和引用[1]的差不多,函数名和变量名稍有不同,但整体逻辑一致,都是分治和合并。可能用户希望看到不同的实现方式,但这两个引用中的代码都是正确的。 引用[3]同样详细描述了归并排序的实现步骤,并给出了完整的Python代码,包括分解、排序和合并的过程。这里还提到了时间复杂度和空间复杂度,对用户理解算法有帮助。示例代码的输出结果也展示了排序后的数组,让用户更直观地看到效果。 引用[4]则是对归并排序的概述,提到了它是分治法的应用,但代码部分可能和前面的引用重复。不过用户可能需要的是具体的实现,所以引用[1]、[2]、[3]中的代码更相关。 接下来,我需要将这些引用中的代码整合成一个清晰易懂的示例。需要注意代码的格式是否正确,比如缩进和函数定义。同时,要确保代码的注释和步骤说明能够帮助用户理解算法的执行过程。 此外,用户可能还关心归并排序的时间复杂度、空间复杂度以及实际应用场景。根据引用[3],归并排序的时间复杂度在各种情况下都是$O(n \log n)$,空间复杂度为$O(n)$,这些信息对用户来说也很重要,应该在回答中提到。 用户的问题是要查找用Python实现归并排序的代码或教程,因此需要提供一个完整的代码示例,并解释其关键步骤。同时,可能还需要比较不同引用中的代码,但看起来它们大同小异,所以选择其中一个清晰的示例即可,或者综合各引用的优点,比如更详细的注释或步骤说明。 最后,根据用户的系统级指令,需要生成相关问题。根据示例中的问题,可以围绕归并排序的性能、优化方法、应用场景等方面提问,确保问题内容相关,并帮助用户进一步学习。</think>以下是用Python实现归并排序的完整代码及分步解析: ### 归并排序实现代码 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) # 递归排序左半部分 right = merge_sort(arr[mid:]) # 递归排序右半部分 return merge(left, right) # 合并两个有序数组 def merge(left, right): sorted_arr = [] i = j = 0 # 比较并合并元素 while i < len(left) and j < len(right): if left[i] < right[j]: sorted_arr.append(left[i]) i += 1 else: sorted_arr.append(right[j]) j += 1 # 添加剩余元素 sorted_arr.extend(left[i:]) sorted_arr.extend(right[j:]) return sorted_arr # 示例 arr = [38, 27, 43, 3, 9, 82, 10] print("排序前:", arr) print("排序后:", merge_sort(arr)) # 输出:[3, 9, 10, 27, 38, 43, 82] ``` ### 关键步骤说明 1. **分解阶段**:通过递归将数组不断二分,直到每个子数组只剩1个元素(自然有序)[^3] 2. **合并阶段**:将两个有序数组合并为一个有序数组,通过双指针$i,j$遍历比较元素[^2] 3. **时间复杂度**:始终为$O(n \log n)$,但需要$O(n)$额外空间存储临时数组[^3] ### 算法特点 - **稳定性**:相等元素的相对顺序不会改变 - **适用场景**:适合链表排序、大数据量外排序(如MapReduce框架) - **对比快速排序**:牺牲空间换取稳定时间复杂度,避免最坏$O(n^2)$情况[^4] 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值