[路飞]_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.排序数组


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

相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
48 0
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
26 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
26 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
76 0
|
2月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
23 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
64 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
128 2