算法题——快速排序

算法思想:

  1. 选择基准值
    • 在待排序的数组中选择一个元素作为基准值,通常选择第一个元素、最后一个元素或中间值。
  2. 分区操作
    • 重新排列数组,使得所有小于基准值的元素都移到基准值的左边,所有大于基准值的元素都移到基准值的右边。这个操作结束后,基准值就处于其最终排序后的位置。
  3. 递归排序
    • 递归地将小于基准值的子数组和大于基准值的子数组进行快速排序。
  4. 合并
    • 因为快速排序是原地排序,所以不需要额外的合并步骤。每个子数组排序完成后,整个数组就变成有序的了。

代码:

class Solution(object):
    def quicksort(self, num,left,right):
        if left >= right:
            return 
        i = left
        j = right
        temp = num[i]
        while i < j:
            while temp <= num[j] and i < j:
                j -= 1
            num[i]= num[j] # 将小的值放入到i位置上
            while temp >= num[i] and i < j:
                i += 1
            num[j] = num[i] # 将
        num[i] = temp # 将基准值放到最后确定的位置上
        self.quicksort(num, left, i - 1)
        self.quicksort(num, i + 1, right)
num = [21,15,7,99,87]
s = Solution()
s.quicksort(num,0,len(num)-1)
print(num) # [7, 15, 21, 87, 99]

时间复杂度:O(nlogn) 类似树形结构,每一轮都能将数组平均分成两部分,那么递归的深度就是 logn。在每一层,都需要 O(n) 的时间来分割数组。

最坏情况下时间复杂度是:O(n^2)

空间复杂度:O(n) 因为每次递归都会确定一个元素的位置,共开辟n个空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值