文章目录
题目
NO. 912
给你一个整数数组 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 <= nums.length <= 50000
-50000 <= nums[i] <= 50000
常用概念
- 大 O 复杂度:并不具体表示代码真正的复杂度,而是表示随着数据规模增长的变化趋势
- 时间复杂度:代码执行时间或执行指令次数,通过大O复杂度表示,称为渐进时间复杂度,简称时间复杂度,一般有4种分类来表示,默认指平均:
- 最好情况时间复杂度:在最理想的情况下,执行这段代码的时间复杂度
- 最坏情况时间复杂度:在最糟糕的情况下,执行这段代码的时间复杂度
- 平均情况时间复杂度:对各类情况加权平均后的时间复杂度,或叫加权平均时间复杂度或者期望时间复杂度
- 均摊时间复杂度:一种特殊的平均时间复杂度,大意是指平摊到每种执行花费的查询时间
- 空间复杂度:类别时间复杂度的概念,表示算法的存储空间与数据规模之间的增长关系。
- 稳定性:对于存在相等元素的待排序元素,经过排序之后,相等元素之间原始顺序是否改变
- 原地排序:指空间复杂度是 O(1)
| 排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 原地排序 |
|---|---|---|---|---|
| 冒泡排序 | O(n2) | O(1) | 稳定 | 是 |
| 插入排序 | O(n2) | O(1) | 稳定 | 是 |
| 选择排序 | O(n2) | O(1) | 不稳定 | 是 |
| 快速排序 | O(n logn) | O(1) | 不稳定 | 是 |
| 归并排序 | O(n logn) | O(n) | 稳定 | 不是 |
| 堆排序 | O(n logn) | O(1) | 不稳定 | 是 |
| 希尔排序 | O(n logn) | O(1) | 不稳定 | 是 |
| 桶排序 | O(n) | O(n) | 稳定 | 不是 |
| 计数排序 | O(n) | O(n+k) | 稳定 | 不是 |
| 基数排序 | O(n) | O(n) | 稳定 | 不是 |
解法一(冒泡[n2]类)
思路:以冒泡为代表的一类排序算法,通过两层循环进行数据对比和排序,这类排序算法的时间复杂度为O(n2),常见的排序算法包括:冒泡排序、选择排序、插入排序,3个的核心思想近似。
- 冒泡排序:查询就像是水里的泡泡往水面冒一样,每次对比相邻两个元素,如果不满足大小关系要求就让它俩互换位置
- 插入排序:取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入
- 选择排序:在未排序区间的数据中,查找最小的元素,放到已排序区间的末尾
- 时间复杂度:O(n2)
- 空间复杂度:O(1)
- 稳定性:稳定(冒泡、插入),不稳定(选择)
- 原地排序:是
解法二、三全部算法通过了全部测试用例,解法一时间复杂度过高,数据量大的时候会超时,有个超时的测试用例有5万个正负整数,具体看链接:https://www.zhenxiangsimple.com/files/tech/testCase20200331.txt
冒泡排序
# author:suoxd123@126.com
class Solution:#冒泡排序
def sortArray(self, nums: List[int]) -> List[int]:
numLen = len(nums)
for i in range(0,numLen):
flag = True #提前退出冒泡循环的标志位
for j in range(0,numLen-1-i):
if nums[j] > nums[j+1]: #比较相邻元素,顺序不满足时,交换位置
nums[j],nums[j+1] = nums[j+1],nums[j]
flag = False #存在数据交换
if flag:
break
return nums
插入排序
# author:suoxd123@126.com
class Solution:#插入排序
def sortArray(self, nums: List[int]) -> List[int]:
numLen = len(nums)
for i in range(1,numLen):# 从前往后表示有序数据放前面
j, tmpVal = i-1, nums[i]
while j >= 0 and nums[j] > tmpVal:#查找插入位置
nums[j+1] = nums[j] # 数据向后移动
j -= 1
nums[j+1] = tmpVal
return nums
选择排序
# author:suoxd123@126.com
class Solution: #选择排序
def sortArray(self, nums: List[int]) -> List[int]:
numLen = len(nums)
for i in range(0,numLen):

本文介绍了数组排序的三种方法:冒泡排序、快速排序和桶排序。详细阐述了每种排序算法的基本思想、时间复杂度、空间复杂度、稳定性和原地排序特性,并给出了具体示例。在大数据量情况下,快速排序和桶排序效率更高,而冒泡排序由于时间复杂度较高可能引发超时问题。
最低0.47元/天 解锁文章
4209

被折叠的 条评论
为什么被折叠?



