返回顶部
首页 > 资讯 > 后端开发 > Python >20190516-归并排序
  • 345
分享到

20190516-归并排序

2023-01-31 00:01:56 345人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

合并两个有序数组中相同的数,输出到一个新的数组中 难度分类 简单 题目描述 合并两个有序数组中相同的数,输出到一个新的数组中 示例1: 输入: nums1 = [1,2,3] nums2 = [2,5,6] 输出: [1,2] 示例2:

合并两个有序数组中相同的数,输出到一个新的数组中

难度分类

简单

题目描述

合并两个有序数组中相同的数,输出到一个新的数组中

示例1:

输入:

nums1 = [1,2,3]

nums2 = [2,5,6]

输出:

[1,2]

示例2:

输入:

nums1 = [1,2,4,9]

nums2 = [1,3,4,7,9]

输出:

[1,4,9]

算法-1

  1. 定义一个空的结果列表来存储2个列表中相同的值
  2. 使用双指针,分别指向2个列表的头部依次取值,当取值结果相等的时候,将值插入结果列表中
  3. 当取值结果不同的时候移动指针指向的值较小的指针,使其指向下一位,然后继续比较
  4. 当其中一个指针指向列表的末尾的时候,证明已经将列表比较完成,此时返回结果,图解如下:

Step1:nums1_index指向nums1的1,nums2_index指向nums2的1,此时nums1_index指向的值与nums2_index指向的值相等,更新result, 移动指针nums1_index与nums2_index分别向后移动一位

Step2: nums1_index指向nums1的2,nums2_index指向nums2的3,此时nums1_index指向的值小于nums2_index指向的值,不相等,因此不更新result, 仅移动nums1_index指针

Step3: nums1_index指向nums1的4,nums2_index指向nums2的3,此时nums1_index指向的值大于nums2_index指向的值,不相等,因此不更新result, 仅移动nums2_index指针

Step4: nums1_index指向nums1的4,nums2_index指向nums2的4,此时nums1_index指向的值与nums2_index指向的值相等,更新result, 移动指针nums1_index与nums2_index分别向后移动一位

……

考点-1

  1. 归并排序
  2. 双指针

代码-1

def mergeTwoLists(nums1,nums2):

    '''使用双指针,比较2个列表中的元素,如果相等则记录结果,如果不相等则挪动指针指向的值较小的列表指针,指向其下一位,直到其中一个指针指向列表的末尾'''

    nums1_index = 0

    nums2_index = 0

    result = []

    while nums1_index<len(nums1) and nums2_index<len(nums2):

        if nums1[nums1_index]==nums2[nums2_index]:

            result.append(nums1[nums1_index])

            nums1_index+=1

            nums2_index+=1

        elif nums1[nums1_index]>nums2[nums2_index]:

            nums2_index+=1

        else:

            nums1_index+=1

return result

print(mergeTwoLists([1,2,3],[1,2,4]))

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9]))

算法-2

该题也可使用python的列表的切片特性来解答,具体步骤如下:

  1. 当2个列表非空的时候进行对比
  2. 当2个列表的第一个元素相等的时候,更新result,使用切片功能使2个列表的第一个元素弹出,第二个元素变成第一个元素
  3. 当2个列表的第一个元素不相等的时候,使用切片功能弹出较小值,然后重复1,2,3步知道其中一个列表为空为止
  4. While 循环和结束条件
  5. 列表切片

考点-2

def mergeTwoLists(nums1,nums2):

    result = []

    while nums1 and nums2:#当2个列表非空的时候进行对比

        if nums1[0] == nums2[0]:#当2个列表的第一个元素相等的时候记录result,然后同时将2个列表的第一个元素弹出,使列表第二个元素变成列表的第一个元素再次重复比较

            result.append(nums1[0])

            nums1 = nums1[1:]

            nums2 = nums2[1:]

        elif nums1[0]>nums2[0]: #如果列表1的第一个元素大于列表2的第一个元素,则切片修改第二个列表,使列表2的第2个元素变成第一个元素,继续对比

            nums2 = nums2[1:]

        else:

            nums1 = nums1[1:]

    return result

print(mergeTwoLists([1,2,3],[1,2,4]))

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9]))

 

算法-3

使用list的pop()函数,具体步骤同算法-2

考点-3

  1. list.pop()函数

代码-3

def mergeTwoLists(nums1,nums2):   

    '''遍历len(nums1)+len(nums2)次,当pop的时候报异常的时候结束遍历'''

    result = []

    for i in range((len(nums1)+len(nums2))):

        try:

            if nums1[0] == nums2[0]:#遍历的时候当两个列表的第1个元素相等的时候,将该元素插入结果列表,然后同时将2个列表的第一个元素弹出,让第二个元素变成第一个元素

                result.append(nums1.pop(0))

                nums2.pop(0)

            elif nums1[0]>nums2[0]:# 如果列表1的第一个元素大于列表2的第一个元素,则将列表2中的第一个元素弹出,使列表2的第2个元素变成第一个元素,继续对比

                nums2.pop(0)

            else:

                nums1.pop(0)

        except:#当pop报错的时候证明某一个列表已经为空,已对比完2个列表,此时返回结果

            return result

print(mergeTwoLists([1,2,3],[1,2,4])) #输出[1,2]

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9]))#输出[1,4,9]

参考-归并排序算法

上述方法主体思想为归并排序,附归并排序合并2个有序链表的代码

def mergeTwoLists(nums1,nums2):

    nums1_index = 0#列表1的指针

    nums2_index = 0#列表2的指针

    result = []

    while nums1_index<len(nums1) and nums2_index<len(nums2):#定义2个指针,遍历2个列表

        if nums1[nums1_index]==nums2[nums2_index]:#如果值相等,则将结果都插入result中,然后指针分别后移一位,比较列表的下一位

            result.append(nums1[nums1_index])

            result.append(nums2[nums2_index])

            nums1_index+=1

            nums2_index+=1

        elif nums1[nums1_index]>nums2[nums2_index]:#如果其中有一个值大,则将较小的值插入result中,然后移动较小值的指针

            result.append(nums2[nums2_index])

            nums2_index+=1

        else:

            result.append(nums1[nums1_index])

            nums1_index+=1

    if nums1_index<len(nums1):

        result+=nums1[nums1_index:]

    else:

        result+=nums2[nums2_index:]

    return result

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9])) #输出[1, 1, 2, 3, 4, 4, 7, 9, 9]

--结束END--

本文标题: 20190516-归并排序

本文链接: https://lsjlt.com/news/182290.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 20190516-归并排序
    合并两个有序数组中相同的数,输出到一个新的数组中 难度分类 简单 题目描述 合并两个有序数组中相同的数,输出到一个新的数组中 示例1: 输入: nums1 = [1,2,3] nums2 = [2,5,6] 输出: [1,2] 示例2: ...
    99+
    2023-01-31
  • c语言排序之归并排序(递归和非递归)
    目录递归代码流程非递归代码流程两者比较时间复杂度代码(递归)代码(非递归)递归代码流程 归并就是把两个或多个序列合并,这里只介绍二路归并,就是不断的把序列分为2组,直到每个组有一个元...
    99+
    2024-04-02
  • java 排序算法之归并排序
    目录简单介绍基本思想思路分析代码实现对代码的一些改进大数据量耗时测试复杂度简单介绍 归并排序(merge sort)是利用 归并 的思想实现的排序方法,该算法采用经典的分治(divi...
    99+
    2024-04-02
  • python排序算法之归并排序
    目录一、前言二、算法描述三、代码实现总结一、前言 相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒...
    99+
    2023-05-17
    python排序算法 python归并排序
  • 归并排序含非递归版
    目录 1.归并排序的原理  2.实现归并排序 2.1框架 2.2区间问题和后序遍历 2.3归并并拷贝 2.4归并排序代码 2.5测试 3.非递归实现归并排序  3.1初次实现 3.2测试  3.3修改  3.4修改测试 1.归并排序的...
    99+
    2023-10-21
    算法
  • 八大排序(三)堆排序,计数排序,归并排序
    一、堆排序 什么是堆排序:堆排序(Heap Sort)就是对直接选择排序的一种改进。此话怎讲呢?直接选择排序在待排序的n个数中进行n-1次比较选出最大或者最小的,但是在选出最大或者最小的数后,并没有对原来的序列进行改变,这使得下一次选数时还...
    99+
    2023-10-21
    算法 数据结构
  • C#实现归并排序
    什么是归并?即将两个有序的数组归并成一个更大的有序数组。 什么是归并排序?先将要排序的数组递归地分成两半分别排序,然后将结果归并起来。 归并排序能够保证将任意大小为 N 的数组排序所...
    99+
    2024-04-02
  • 归并排序python实现
      归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过程中完成了排序,合并排序算法如下: def mer...
    99+
    2023-01-31
    python
  • golang归并排序,快速排序,堆排序的实现
    归并排序 归并排序使用经典的分治法(Divide and conquer)策略。分治法会将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得...
    99+
    2024-04-02
  • Python3实现快速排序、归并排序、堆
    # -*- coding: utf-8 -*- # @Time : 2019-03-26 16:46 # @Author : Jayce Wong # @ProjectName : leetcode # @Fi...
    99+
    2023-01-31
    快速
  • 图解Java排序算法之归并排序
    目录基本思想合并相邻有序子序列代码实现总结基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(...
    99+
    2024-04-02
  • PHP 数组快排 vs. 归并排序
    快排是一种递归算法,将数组划分成较小元素和较大元素两部分并递归排序,而归并排序将数组递归地分成较小的数组,对每个小数组排序,再合并回原始数组。php 实现的代码分别为:快排:将数组划分为...
    99+
    2024-04-26
    **php 排序**
  • 什么是Java归并排序
    本篇内容主要讲解“什么是Java归并排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Java归并排序”吧!基本介绍归并排序(merge-sort)是利用归并的思想实现的排序方法,该算法采...
    99+
    2023-06-15
  • Java实现插入排序,希尔排序和归并排序
    目录插入排序算法步骤动图演示JavaScript代码实现Python代码实现Go代码实现Java代码实现希尔排序算法步骤JavaScript代码实现python代码实现Go代码实现J...
    99+
    2022-12-22
    Java插入排序 Java希尔排序 Java归并排序 Java排序
  • Java综合整理堆排序 快速排序 归并排序
    目录堆排序快速排序递归非递归归并排序递归非递归堆排序 时间复杂度:0(N*log(N))空间复杂度:0(1)稳定性:不稳定 private static void heapSort...
    99+
    2024-04-02
  • C语言常见排序算法归并排序
    目录前言 一、归并排序1.1 基本思想1.2 算法思想1.3 程序设计思想1.4 程序实现1.5 归并排序的特性总结前言 本期为大家带来的是常见排序算法中的归并排序,博主在...
    99+
    2024-04-02
  • Java的堆排序、快速排序、归并排序怎么实现
    本文小编为大家详细介绍“Java的堆排序、快速排序、归并排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的堆排序、快速排序、归并排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。堆排序...
    99+
    2023-06-26
  • python编程实现归并排序
    因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现。 还是先阐述一下排序思路: 首先归并排序使用了二分法,归根到底的思想还是分而治...
    99+
    2022-06-04
    python
  • php怎么实现并归排序
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php实现归并排序算法归并排序算法的复杂度是O(nlogn)。代码如下,只需要clone下来执行composer install然后执行 php artisan te...
    99+
    2024-04-02
  • python中什么是归并排序
    本篇文章为大家展示了python中什么是归并排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作