[路飞]_leetcode-912-排序数组

简介: leetcode-912-排序数组

网络异常,图片无法展示
|


「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战


[题目地址][B站地址]


给你一个整数数组 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]
复制代码


提示:


  1. 1 <= nums.length <= 50000
  2. -50000 <= nums[i] <= 50000


本题很简单,就是要我们对数组 nums 做一个升序排序


关于常见的排序方法,我之前有一篇文章进行了总结,感兴趣的小伙伴可以去看下 《常用数组排序算法》,所以这里不再对各种排序的过程及实现做重复表述


对于本题,我分别采用了以下几种排序方式进行了提交,每一种排序算法的用时记录如下:


冒泡排序    8480ms
选择排序    2576ms
插入排序    6080ms
希尔排序     136ms
归并排序    4056ms
快速排序    2944ms
计数排序     132ms
Array.sort  136ms
复制代码


需要注意的是本题的快排要使用交换元素进行排序的快排算法,而通过基准值拆分左右数组的快排算法因为空间复杂度太高,会导致爆栈,无法通过提交


这里要说明的是以上用户记录只是当次提交的用时记录,leetcode每次提交的用时会受网络等原因影响有一些波动,例如 shellSort 以及 Array.sort 的提交的都是达到过 110ms 左右的


但是以上数据还是能充分说明哪些排序算法的用时会更优一些


用时最短的是 希尔排序计数排序以及Array.sort


希尔排序通过对插入排序进行步长拆分的优化,使得插入排序的过程移动距离减小,从而达到高效的排序


计数排序通过下标数组记录原数组中元素的值以及该值出现的次数,然后通过遍历计数数组得到排序后的数组,因为该过程不涉及到比较大小,所以快于任何比较排序算法,时间复杂度为 复杂度为Ο(n+k)


Array.sort 查看 V8 源码可以看到当排序区间小于等于10的时候,会使用插入排序,反之会使用快速排序,而且它的快速排序肯定要比我文章中的快排进行了更多的优化,所以达到了如此高效的排序效率


v8 array.js InnerArraySort 710行


至此,我们就完成了 leetcode 912.排序数组


如有任何问题或建议,欢迎留言讨论!

相关文章
|
3月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
136 1
|
11月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
109 0
|
11月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
82 4
|
11月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
94 0
Leetcode第三十三题(搜索旋转排序数组)
|
11月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
181 0
|
11月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
76 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
187 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
139 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
303 2
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
199 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

热门文章

最新文章