快速排序(详解及python实现)

        快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。采用了分治法。

基本思想:

  1. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
  2. 然后再按此方法对这两部分数据分别进行快速排序,
  3. 整个排序过程可以递归进行,以此达到整个数据变成有序序列。

在一篇博客上看到给出的一种快速排序的方法快速排序(过程图解)但感觉复杂化了

举例子:
对序列:9,4,3,7,6,8,5进行快速排序
        先选一个基准(这里每次基准都选第一个数值),选9,然后设置两个哨兵 i , j i,j ij i i i从序列左边开始探测,直到找到大于基准9的值, j j j从右边开始探测,知道找到小于基准9的值,即:

9437685
基准 i , j i,j i,j

        此时, i , j i,j i,j都处于4的位置,说明9后面的值都比9小,交换9和4的位置。9的位置不再动,然后以4为基准:

5437689
基准 j j j i i i

        由于 i > j i>j i>j,3和7不交换,基准5插入3/7中间,此时序列分为了两部分(4,3)(7,6,8)

4357689
基准 i , j i,j i,j基准 j j j i i i

        (4,3)中 i , j i,j i,j在同一位置,小于4,交换4和3,(7,6,8)中, i > j i>j i>j,7插入6/8中

3456789
基准基准基准

        此时被分为了三个长度为1的序列(3)(6)(8),排序结束。


比较简单易懂的一种快速排序:

  1. 选取中间值作为基准值(基准值可以随便选),取出基准值。
  2. 数列从第一个元素开始和基准值进行比较,小于基准值,那么将它放入左边的分区中,第二个元素比基准值大,把它放入右边的分区中。
  3. 然后依次对左右两个分区进行再分区,直到最后只有一个元素。
  4. 分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区。
    以2,5,9,3,7,1,5为例:
2593715
基准
2135975
2135975
基准基准
1235579
基准基准基准

从这可以看出,快速排序是不稳定的:

1235579
基准

python代码实现:

'''快速排序'''
def Quicksort(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    if len(nums)<2:return nums
    mid = len(nums)//2
    jizhun = nums[mid]
    nums.pop(mid)
    left, right = [], []
    for i in range(len(nums)):
        if nums[i]>jizhun:
            right.append(nums[i])
        else:
            left.append(nums[i])
    return Quicksort(left)+[jizhun]+Quicksort(right)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狂奔的菜鸡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值