排序算法(二) —— 快速排序(Quick Sort)

参考:https://www.cnblogs.com/onepixel/articles/7674659.html

快速排序(Quick Sort)

时间复杂度(平均): O(nlog2 n)  时间复杂度(最坏):O(n^2)   时间复杂度(最好):O(nlog2 n)    空间复杂度:O(n)  稳定性:不稳定

 

算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

代码

'''
快速排序(Quick Sort)
采用递归, 结束条件, nums 长度小于等于1,返回nums, 否则, 从第二个元素开始跟第一个元素比较, 大于则不处理, 小于则向前替换至第一个大于首位元素的前面;
之后将首位元素移动到小于首位的元素的后面
然后递归对小于首位元素的数组和大于首位元素的数组进行快速排序

原理:依次定位首位元素的位置

时间复杂度(平均): O(nlog2 n)  时间复杂度(最坏):O(n^2)   时间复杂度(最好):O(nlog2 n)    空间复杂度:O(n)  稳定性:不稳定

'''

def sort(nums):
    if len(nums) < 2:
        return nums
    current_value = nums[0]
    max_start = 1
    for i in range(1, len(nums), 1):
        if nums[i] >= current_value:
            continue
        if nums[i] < current_value:
            temp = nums[i]
            j = i
            while j > max_start:
                nums[j] = nums[j - 1]
                j -= 1
            nums[j] = temp
            max_start += 1
    k = 1
    while k < max_start:
        nums[k - 1] = nums[k]
        k += 1
    nums[k - 1] = current_value
    left = sort(nums[:k-1])
    right = sort(nums[k:])
    return left + [nums[k-1]] + right

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微知girl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值