归并排序

本文深入讲解了归并排序算法的基本思想,包括不断的数组划分与合并过程。通过详细的算法步骤和代码实现,阐述了如何将一个数组划分为多个子数组,并最终合并为一个有序数组。分析了归并排序的时间复杂度,解释了为何其能达到nlogn的效率。

归并排序的思想

不断对数组进行划分,每一次的划分都会产生两个子数组,然后将这两个子数组合并。

算法演示

划分

合并

说明

算法的精髓在于不短的划分和合并。当划分到不能再划分的时候,就开始合并。
划分好理解 ,就是将一个数组分为两个数组。
合并就是将两个数组合为一个有序数组。这里有个注意点。合并的时候,两个子数组必然是已经排好序的,因为第一次合并的时候,子数组只有一个元素,后面不断地合并也是合并成一个个有序数组

时间复杂度

我们需要进行 logn次划分,每一次地划分对应一次排序,所以也是logn次排序。
每一次排序将两个有序数组合并成为一有序个数组 时间复杂度为 n

def merge(data,begin,mid,end):
    p_left = begin
    p_right = mid + 1
    temp = []
    while p_left <= mid and p_right <= end:
        if data[p_left] <= data[p_right] :
            temp.append(data[p_left])
            p_left += 1
        else:
            temp.append(data[p_right])
            p_right += 1

    while p_left <= mid:
        temp.append(data[p_left])
        p_left += 1

    while p_right <= end:
        temp.append(data[p_right])
        p_right += 1

    for i in temp:
        data[begin] = i;
        begin += 1
复制代码

所以总体时间复杂度为 nlogn

整体算法
"""
归并排序
"""

datas1 = [1, 2, 4, 6, 3, 1, 3, 43, 547, 123, 436, 57, 98, 976, 543, 2112, 378988, 7654321, 32]

def merge(data,begin,mid,end):
    p_left = begin
    p_right = mid + 1
    temp = []
    while p_left <= mid and p_right <= end:
        if data[p_left] <= data[p_right] :
            temp.append(data[p_left])
            p_left += 1
        else:
            temp.append(data[p_right])
            p_right += 1

    while p_left <= mid:
        temp.append(data[p_left])
        p_left += 1

    while p_right <= end:
        temp.append(data[p_right])
        p_right += 1

    for i in temp:
        data[begin] = i;
        begin += 1

def mergeSort(data,begin,end):
    if begin < end:
        mid = (begin + end) // 2
        mergeSort(data,begin, mid)
        mergeSort(data,mid + 1,end)
        merge(data,begin,mid,end)

mergeSort(datas1,0,len(datas1) - 1)
print(datas1)
复制代码

转载于:https://juejin.im/post/5c84b6f45188257e9261e7e6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值