归并排序-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 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一,聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类,就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类,使得同一个簇内的样本有着更相近的属性。依不同的实现策略,聚类算法有很多种,如基于距离的k-means、基于密度的DBSCAN等。在聚类完成之后

回归模型的算法性能评价

一、概述 在一般形式的回归问题中,会得到系列的预测值,它们与真实值(ground truth)的比较表征了模型的预测能力,为有效量化这种能力,常见的性能评价指标有可解释方差(EVS)、平均绝对误差(MAE)、均方误差(MSE)、均方根误差(RMSE)、决定系数(R2)等。值得一提的是,回归问题分单输