给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

方法三:归并排序
思路

归并排序利用了分治的思想来对序列进行排序。对一个长为 n 的待排序的序列,我们将其分解成两个长度为的子序列。每次先递归调用函数使两个子序列有序,然后我们再线性合并两个有序的子序列使整个序列有序。

算法

定义 mergeSort(nums, l, r) 函数表示对 nums 数组里 [l,r] 的部分进行排序,整个函数流程如下:

递归调用函数 mergeSort(nums, l, mid) 对 nums 数组里 [l,mid] 部分进行排序。

递归调用函数 mergeSort(nums, mid + 1, r) 对 nums 数组里 [\textit{mid}+1,r][mid+1,r] 部分进行排序。

此时 nums 数组里 [l,\textit{mid}][l,mid] 和 [\textit{mid}+1,r][mid+1,r] 两个区间已经有序,我们对两个有序区间线性归并即可使 nums 数组里 [l,r][l,r] 的部分有序。

线性归并的过程并不难理解,由于两个区间均有序,所以我们维护两个指针 ii 和 jj 表示当前考虑到 [l,\textit{mid}][l,mid] 里的第 ii 个位置和 [\textit{mid}+1,r][mid+1,r] 的第 jj 个位置。

如果 nums[i] <= nums[j] ,那么我们就将 \textit{nums}[i]nums[i] 放入临时数组 tmp 中并让 i += 1 ,即指针往后移。否则我们就将 \textit{nums}[j]nums[j] 放入临时数组 tmp 中并让 j += 1 。如果有一个指针已经移到了区间的末尾,那么就把另一个区间里的数按顺序加入 tmp 数组中即可。

这样能保证我们每次都是让两个区间中较小的数加入临时数组里,那么整个归并过程结束后 [l,r][l,r] 即为有序的。

如下的动图展示了两个有序数组线性归并的过程:

class Solution:def merge_sort(self, nums, l, r):if l == r:returnmid = (l + r) // 2self.merge_sort(nums, l, mid)self.merge_sort(nums, mid + 1, r)tmp = []i, j = l, mid + 1while i <= mid or j <= r:if i > mid or (j <= r and nums[j] < nums[i]):tmp.append(nums[j])j += 1else:tmp.append(nums[i])i += 1nums[l: r + 1] = tmpdef sortArray(self, nums: List[int]) -> List[int]:self.merge_sort(nums, 0, len(nums) - 1)return nums
class Solution:def merge_sort(self, nums,l,r):if l ==r:returnmid =(l+r)//2self.merge_sort(nums,l,mid)self.merge_sort(nums,mid+1,r)tmp =[]i,j = l,mid+1while i <= mid or j<=r:if i>mid or (j<=r and nums[j] <nums[i]):tmp.append(nums[j])j+=1else:tmp.append(nums[i])i+=1nums[l: r+1] =tmpdef sortArray(self, nums: List[int]) -> List[int]:self.merge_sort(nums,0,len(nums)-1)return nums
class Solution:def merge_sort(self, nums,l,r):if l ==r:return mid = (l+r) //2self.merge_sort(nums,l,mid)self.merge_sort(nums,mid+1,r)tmp =[]i,j =l,mid+1while i<= mid or j<=r:if i >mid or (j<=r and nums[j] <nums[i]):tmp.append(nums[j])j+=1else:tmp.append(nums[i])i+=1nums[l:r+1] =tmpdef sortArray(self, nums: List[int] -> List[int]:self.merge_sort(nums, 0, len(nums)-1)return nums
class Solution:def merge_sort(self, nums,l,r):

2021-09-07912. 排序数组相关推荐

  1. 数据结构与算法--数字在排序数组中出现次数

    数字在排序数组中出现次数 题目:统计一个数字在一个排序数组中出现的次数.例如,输入数组{1,2,3,3,3,3,3,4,5} 和数字3,由于3 在数组中出现的次数是5,因此返回5 简单方案一 既然输入 ...

  2. python旋转排序数组_LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现...

    题目描述: python实现Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  3. 2021.09.27 MySQL笔记

    2021.09.27 MySQL笔记 文章目录 2021.09.27 MySQL笔记 一.展示当前存在的所有数据库 二.使用(选中)一个数据库 三.创建一个数据表 四.查询并展示该数据库内的所有数据表 ...

  4. 【力扣网练习题】删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  5. leetcode--删除排序数组中的重复项--python

    文章目录 题目 题目详情 示例 说明 解题代码 思路 代码 运行结果 最佳方案 题目 题目详情 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要 ...

  6. 刻意练习:LeetCode实战 -- Task02. 删除排序数组中的重复项

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  7. LeetCode实战:删除排序数组中的重复项

    题目英文 Given a sorted array nums, remove the duplicates in-place such that each element appear only on ...

  8. 【每日一算法】删除排序数组中的重复项

    微信改版,加星标不迷路! 每日一算法-删除排序数组中的重复项 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次 ...

  9. [示例]NSDictionary-按value排序数组中的字典并输出(描述器)

    1.将四个学生信息的字典存入数组中,输出数据以班级:XXX,姓名:XXX,年龄:XX格式. 2.删除小明此条数据,列出剩余数据,输出格式同上. 3.按照班级进行排序,如果班级相同则按照年龄排序输出数据 ...

  10. 数组-删除排序数组中的重复项(双指针法)

    题意: 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件 ...

最新文章

  1. 利用链式存储结构实现线性表
  2. Siri:开启智能语音营销时代
  3. 类和对象—对象特性—构造函数和析构函数
  4. 涨知识!船东提单和货代提单的区别!
  5. python Intel Realsense D435 图像自动采集程序 自动剔除模糊图像
  6. Android鬼点子 100行代码,搞定柱状图!
  7. 电信诈骗?一招让骗子血本无归!
  8. eclipse中设定文档注释
  9. 如何理解,互联网架构“高并发”?
  10. CodeForce 855B 暴力or线段树
  11. 快来领取哔哩哔哩412张超清壁纸!
  12. 设计之星 ai_漫画 |《钢铁之星》:AI肆虐的时代,夹杂人类阴谋
  13. python处理矩阵运算、转置矩阵、逆矩阵、单位矩阵
  14. 西电计科操作系统实验
  15. 微信小程序 wx.request 的封装
  16. IT开发资料大全 转
  17. 一天一夜chromebook折腾心得
  18. 2.递归解决年龄问题
  19. xt6使用技巧_凯迪拉克XT6:这几个“驾驶技巧”并不省油
  20. lightoj刷题日记

热门文章

  1. linux中SPI相关API函数,linux spi驱动开发学习(一)-----spi子系统架构
  2. hibernate java.util.date 精度_hibernate中java.util.Date类型映射
  3. 人工智能写作:想要和智能对话 本AI给你的写作指个路
  4. C#编程(七)----------命名空间
  5. Linux 异步IO
  6. 数组操作--微信小程序学习教程 1
  7. oracle11g服务项及其启动顺序
  8. php laravel 相关收集
  9. 5.19 学习日记 活干得差不多了
  10. php实现小说字典功能_PHP实现微信小程序人脸识别刷脸登录功能