归并排序-Python

归并,排序,python · 浏览次数 : 41

小编点评

**归并排序的时间复杂度:O(nlogn),空间复杂度为O(n)** **步骤:** 1. **合并两个有序数组**(`def merge(left_array, right_array)`) - 两个数组的长度分别为 `len(left_array)` 和 `len(right_array)` - 创建一个新的空数组 `merge_array` - 两个指针 `left_index` 和 `right_index` 指向 `left_array` 和 `right_array` 的首地址 - 循环比较两数组的元素,并将较小的元素添加到 `merge_array` 中 - 继续向 `merge_array` 中添加元素直到其中一个数组为空 2. **递归排序左右数组**(`def merge_sort(array)`) - 如果 `array` 的长度为 1,则视为已排序,返回 - 否则,将 `array` 分为左右两半 - 递归地排序左右两个子数组 3. **合并排序结果**(`def merge(left_array, right_array)`) - 创建一个新的空数组 `res` - 两个指针 `left_index` 和 `right_index` 指向 `left_array` 和 `right_array` 的首地址 - 循环比较两数组的元素,并将较小的元素添加到 `res` 中 - 继续向 `res` 中添加元素直到其中一个数组为空 **时间复杂度分析:** - 合并两个数组:`O(nlogn)`,其中 `n` 是数组的长度 - 递归排序左右数组:`O(nlogn)` - 合并排序结果:`O(n)` **空间复杂度分析:** - 合并两个数组:`O(n)` - 递归排序左右数组:`O(n)` - 合并排序结果:`O(n)` **代码示例:** ```python def merge(left_array, right_array): left_index, right_index, merge_array = 0, 0, list() while left_index < len(left_array) and right_index < len(right_array): if left_array[left_index] <= right_array[right_index]: merge_array.append(left_array[left_index]) left_index += 1 else: merge_array.append(right_array[right_index]) right_index += 1 merge_array = merge_array + left_array[left_index:] + right_array[right_index:] return merge_array ```

正文

归并排序的时间复杂度O(nlogn),空间复杂度为O(n)

首先我们先假设有两个有序数组,我们去进行一次归并

 

用代码实现

def merge(li: list, start: int, mid: int, end: int) :
    res=[]
    j = mid +1
    while start <= mid and j <= end:
        if li[start] < li[j]:
            res.append(li[start])
            start +=1
        else:
            res.append(li[j])
            j +=1
    #运行到这一步,说明左右两边一定有一遍已经下标已经超了,即一定有一遍数字已经没了
    #然后判断如果是左边还有数字就把左边剩下的数字全部插入列表中,无需在做判断
    #判断如果是右边还有数字就把左边剩下的数字全部插入列表中,无需在做判断
    while start <= mid:
        res.append(li[start])
        start +=1
    while j <= end:
        res.append(li[j])
        j +=1
    
    return res

 最后交给递归

def merge_sort(array):
    if len(array) == 1:
        return array
    left_array = merge_sort(array[:len(array) // 2])
    right_array = merge_sort(array[len(array) // 2:])
    return merge(left_array, right_array)


def merge(left_array, right_array):
    left_index, right_index, merge_array = 0, 0, list()
    while left_index < len(left_array) and right_index < len(right_array):
        if left_array[left_index] <= right_array[right_index]:
            merge_array.append(left_array[left_index])
            left_index += 1
        else:
            merge_array.append(right_array[right_index])
            right_index += 1
    merge_array = merge_array + left_array[left_index:] + right_array[right_index:]
    return merge_array

 

与归并排序-Python相似的内容:

归并排序-Python

归并排序的时间复杂度O(nlogn),空间复杂度为O(n) 首先我们先假设有两个有序数组,我们去进行一次归并 用代码实现 def merge(li: list, start: int, mid: int, end: int) : res=[] j = mid +1 while start <= mi

归并排序(递归)(NB)

博客地址:https://www.cnblogs.com/zylyehuo/ 递归思路 # _*_coding:utf-8_*_ import random def merge(li, low, mid, high): i = low j = mid + 1 ltmp = [] while i <=

归并排序 nO(lgn) 审核中

大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常开发中常用的算法,并结合实际的应用场景,真正的感受算法的魅力。 代码已经上传github https

C#归并排序算法

前言 归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并并排序,最终得到一个有序的序列。 归并排序实现原理 将待排序序列分割成两个子序列,直到每个子序列中只有一个元素。 将相邻的两个子序列合并,并

简述几种常用的排序算法

摘要:归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分治的思想,代码都通过递归来实现,过程非常相似。理解归并排序的重点是理解递推公式和 merge() 合并函数。 本文分享自华为云社区《深入浅出八种排序算法》,作者:嵌入式视觉 。 归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分

数据结构作业(五):直接插入排序 和 归并排序

好家伙,写作业 1.直接插入排序 这是个非常简单的排序 将一串数分为有序区和无序区 然后将无序区的数一个个按照正确的顺序放到有序区 2.归并排序 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为二路归并。 其中我们要解决的一个

Kafka实时数据即席查询应用与实践

Kafka中的实时数据是以Topic的概念进行分类存储,而Topic的数据是有一定时效性的,比如保存24小时、36小时、48小时等。而在定位一些实时数据的Case时,如果没有对实时数据进行历史归档,在排查问题时,没有日志追述,会很难定位是哪个环节的问题。

Pandas 使用教程 Series、DataFrame

[TOC] Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算) Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。 Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工

归约证明在密码学中的应用

在现代信息社会,密码学在保护信息安全中扮演着至关重要的角色。而归约证明(Reduction Proof)作为密码学中的一个重要工具,通过将一个问题的安全性归约为另一个已知问题的难解性,从而证明新问题的安全性。本文将详细介绍归约证明的概念、步骤及其在密码学中的应用。

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型,在许多问题场景中有着广泛的运用,是模式识别问题中一种主要的实现手段。分类问题概况起来就是,对一堆高度抽象了的样本,由经验标定了每个样本所属的实际类别,由特定算法训练得到一个分类器,输入样本属性即自动计算出其所属类别,从而完成特定的识别任务。依实现原