一日一技:如何更好地理解归并排序?

简介: 一日一技:如何更好地理解归并排序?

摄影:产品经理厨师:kingname

请确保你已经看了我昨天的公众号文章。昨天的内容是今天的基础。

一日一技:在 Python 里面如何合并多个有序列表并使得结果依然有序?

在昨天的文章里面,我们已经知道,可以使用 heapq.merge把两个有序列表合并成新的有序列表。

现在,我们来设计一个排序算法,对列表:[1,4,2,0,4,5,1,-3,-8,188,34] 进行排序。

我们现在先把列表拆分成a列表:[1,4,2,0,4,5]和b列表 [1,-3,-8,188,34]。如果我们能够分别让这两个列表各自有序,然后应用昨天的方法,合并一下,最终结果自然就出来了。

那么如何让这两个列表各自有序呢?我们以 [1,4,2,0,4,5]为例。继续把它拆分为两个列表 [1,4,2][0,4,5]。只要这两个列表各自有序,那么合并一下就行了。

我们再来看 [1,4,2],如何让它有序呢?我们继续分成两个列表 [1][4,2]。显然只有一个元素的列表 [1]是有序的。

再来看 [4,2],继续分成两个列表 [4][2]。这两个列表都只有一个元素,所以他们都是有序的。此时对他们进行合并,得到 [2,4]

[1][2,4]合并,得到 [1,2,4]

[1,2,4][0,4,5]合并,得到 [0,1,2,4,4,5]

[0,1,2,4,4,5][-8,-3,1,34,188]合并,得到 [-8,-3,0,1,1,2,4,4,5,34,188]

排序完成。

整个过程先拆分再合并,这种排序算法叫做 归并算法。它的时间复杂度始终是 O(nlogn)。而我们常常听说的快速排序,只有在最好的情况下时间复杂度才能达到 O(nlogn)。所以归并排序在时间复杂度这个角度是优于快速排序的。

那么如何使用代码来实现呢?合并的部分请看昨天的文章,今天我们主要描述拆分的逻辑:

import heapq
def sort(target):
    if not target:
        return []
    if len(target) == 1:
        return target
    left = target[:len(target) // 2]
    right = target[len(target)//2 :]
    sorted_left = sort(left)
    sorted_right = sort(right)
    result = heapq.merge(sorted_left, sorted_right)
    return result

运行效果如下图所示:

目录
相关文章
|
存储 算法 搜索推荐
时间复杂度:一步步理解算法效率
时间复杂度:一步步理解算法效率,更多文章可关注我的微信公众号:Python学习杂记
333 0
|
搜索推荐 算法 索引
冒泡排序算法的实现和优化~
冒泡排序算法的实现和优化~
|
搜索推荐 算法
|
6月前
|
搜索推荐 算法 JavaScript
探索冒泡排序:原理、实现与优化
探索冒泡排序:原理、实现与优化
|
6月前
|
搜索推荐 算法 数据处理
从程序设计的角度探索排序算法:冒泡排序的实现与优化
从程序设计的角度探索排序算法:冒泡排序的实现与优化
40 0
|
6月前
|
人工智能 搜索推荐
【hoare基础版】快速排序算法(1)
【hoare基础版】快速排序算法(1)
83 0
|
6月前
|
存储 算法
快速排序:非递归的优势与性能详解
快速排序:非递归的优势与性能详解
57 1
|
6月前
|
搜索推荐 算法 调度
堆排序:高效而稳定的排序算法
在计算机科学中,排序算法是一项基本而重要的任务。堆排序作为一种经典的排序算法,以其高效性和稳定性而受到广泛关注。本文将介绍堆排序的原理、实现方法以及其在实际应用中的优势。
|
搜索推荐 算法
深入探究排序算法:快速排序的实现与优化
排序算法是计算机科学中的基础知识,它们在各种应用和场景中都扮演着重要角色。本文将深入探讨一种经典的排序算法——快速排序,并介绍其实现原理及优化技巧。
83 1
|
搜索推荐
21 常见排序算法效率比较
21 常见排序算法效率比较
215 0