3类方法 - 实现数组排序

本文介绍了数组排序的三种方法:冒泡排序、快速排序和桶排序。详细阐述了每种排序算法的基本思想、时间复杂度、空间复杂度、稳定性和原地排序特性,并给出了具体示例。在大数据量情况下,快速排序和桶排序效率更高,而冒泡排序由于时间复杂度较高可能引发超时问题。
摘要由CSDN通过智能技术生成


题目

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


常用概念

  1. 大 O 复杂度:并不具体表示代码真正的复杂度,而是表示随着数据规模增长的变化趋势
  2. 时间复杂度:代码执行时间或执行指令次数,通过大O复杂度表示,称为渐进时间复杂度,简称时间复杂度,一般有4种分类来表示,默认指平均:
    1. 最好情况时间复杂度:在最理想的情况下,执行这段代码的时间复杂度
    2. 最坏情况时间复杂度:在最糟糕的情况下,执行这段代码的时间复杂度
    3. 平均情况时间复杂度:对各类情况加权平均后的时间复杂度,或叫加权平均时间复杂度或者期望时间复杂度
    4. 均摊时间复杂度:一种特殊的平均时间复杂度,大意是指平摊到每种执行花费的查询时间
  3. 空间复杂度:类别时间复杂度的概念,表示算法的存储空间与数据规模之间的增长关系。
  4. 稳定性:对于存在相等元素的待排序元素,经过排序之后,相等元素之间原始顺序是否改变
  5. 原地排序:指空间复杂度是 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个的核心思想近似。

  1. 冒泡排序:查询就像是水里的泡泡往水面冒一样,每次对比相邻两个元素,如果不满足大小关系要求就让它俩互换位置
  2. 插入排序:取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入
  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):
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放羊郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>