快速排序 快排 leetcode215题 性能分析(时间空间复杂度)

背景

在这里插入图片描述

解题

-图片来自geek
快排:
如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。
在这里插入图片描述
将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间

可以这样放置
在这里插入图片描述
但是这样就不是原地的了,所以优化成如图

在这里插入图片描述

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        r = len(nums)
        res = Solution.inplace_quick_sort(nums,0,r-1,k)
        print(nums)
        return res

    def inplace_quick_sort(s,p,r,k):
        """列表的就地快速排序,s为列表,a为起始索引,b为终止索引"""
        if p >= r:
            return s[p]
        # s[r]作为基准值
        pivot = s[r]
        i=p
        j = p
        # 把除了s[r]的其他元素按照以s[r]为基准分割
        # i是要插入的位置,j是要比较的元素位置
        # 如果是从大到小排序,则判断j是不是比pivot大,如果大就和在前面的i交换,然后i和j都像后移动一位,也就是j要比较后面的,i前面的都是比较完的
        while j < r:
            if s[j] > pivot:
                s[i],s[j] = s[j],s[i]
                i = i+1
            j = j+1
        s[i],s[r] = s[r],s[i]

        if k == (i+1): return s[i]
        elif k > (i+1): Solution.inplace_quick_sort(s,i+1,r,k)
        else: Solution.inplace_quick_sort(s,p,i-1,k)

        return s[k-1]

性能分析

快排是一种原地、不稳定的排序算法

快排本身的时间复杂度也是 O(nlogn)归并推导相同,但是前面的代码我们进行了优化,也就是根据k来决定排序哪一个子数组

第一次分区查找,我们需要对大小为 n 的数组执行分区操作,需要遍历 n 个元素。
第二次分区查找,我们只需要对大小为 n/2 的数组执行分区操作,需要遍历 n/2 个元素。
依次类推,分区遍历元素的个数分别为、n/2、n/4、n/8、n/16.……直到区间缩小为 1。
如果我们把每次分区遍历的元素个数加起来,就是:n+n/2+n/4+n/8+…+1。
这是一个等比数列求和,最后的和等于 2n-1。所以,上述解决思路的时间复杂度就为 O(n)。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值