排序算法之快速排序

1.算法原理

快速排序是一种常用的排序算法,它基于分治的思想。它的基本思想是选择一个基准元素,通过一次排序将待排序的序列分割成两个子序列,其中一个子序列中的元素都小于基准元素,另一个子序列中的元素都大于等于基准元素。然后对这两个序列分别进行递归地快速排序,最终得到有序的结果。
下面是快速排序的详细步骤:
1.选择一个基准元素,通常选择序列的第一个元素或者随机选择一个元素。
2.将序列中比基准元素小的元素移到基准元素的左边,比基准元素大的元素移到右边。这个过程称为划分(partition)操作,可以使用双指针的方式进行。
3.对基准元素左边的子序列和右边的子序列分别递归地应用上述步骤。

2.代码实现

def quicksort(lst, first, last):
    if first < last:
        # 分裂点
        split_point = partition(lst, first, last)
        # 递归调用
        quicksort(lst, first, split_point-1)
        quicksort(lst, split_point + 1, last)

def partition(lst, first, last):
    # 选定中值
    key = lst[first]
    # 左右指针索引初始化
    leftmark = first + 1
    rightmark = last
    # 结束标志变量
    flag = False
    while not flag:
        # 左指针向右移动
        while leftmark <= rightmark and lst[leftmark] < key:
            leftmark += 1
        # 右指针向左移动
        while rightmark >= leftmark and lst[rightmark] > key:
            rightmark -= 1
        # 找到中值点
        if rightmark < leftmark:
            flag = True
        # 交换左右索引对应的元素
        else:
            lst[leftmark], lst[rightmark] = lst[rightmark], lst[leftmark]
    # 交换中值与右指针所指元素
    lst[first], lst[rightmark] = lst[rightmark], lst[first]
    # 返回中值点,也是分裂点
    return rightmark

具体示例

下面是一个具体示例,展示了对序列[6, 5, 3, 1, 8, 7, 2, 4]进行快速排序的过程:

初始序列:[6, 5, 3, 1, 8, 7, 2, 4]
选择基准元素,这里选择第一个元素6:
步骤1:划分操作,将比6小的元素移到左边,比6大的元素移到右边。
[2, 5, 3, 1, 4, 6, 7, 8]
步骤2:对基准元素左边的子序列[2, 5, 3, 1, 4]递归地应用上述步骤。
选择基准元素,这里选择第一个元素2:
划分操作:
[1, 2, 3, 5, 4]
继续递归进行划分操作,直到子序列只有一个元素。
步骤3:对基准元素右边的子序列[7, 8]递归地应用上述步骤。
由于子序列[7, 8]只有两个元素,已经是有序的,不需要再进行划分操作。
最终得到的有序序列为:[1, 2, 3, 4, 5, 6, 7, 8]
这就是快速排序算法对序列[6, 5, 3, 1, 8, 7, 2, 4]的排序过程。

3.时空复杂度

时间复杂度:快速排序无非就是分列和与基准元素比较,最好情况的话如果每次分裂总能使得两边数据量相等,那么分裂就是O(logn),然后每个元素都需要与基准元素比较,就是O(n),那么综合一起就是O(nlogn),最坏情况 也就是基准元素选取使得一边元素很少甚至于没有,那么时间复杂度就变成了O(n^2),平均情况下是O(nlogn)。这使得快速排序在大多数情况下表现良好。
空间复杂度:O(logn)。

4.快速排序特点

稳定性

快速排序是不稳定排序,相等元素的相对顺序在排序后可能发生改变。

优缺点

快速排序的优点包括:
平均时间复杂度较低,是常用的排序算法之一。
原地排序,节省了额外的空间开销。

快速排序的缺点包括:
最坏情况下的时间复杂度较高,当选择的基准元素不合适时,可能导致递归树的不平衡,使得时间复杂度达到O(n^2)。

与其他算法对比

与其他排序算法相比,快速排序的性能相对较好。与 归并排序 相比,快速排序不需要额外的空间开销,而且常数因子较小。与堆排序相比,快速排序对缓存更友好,因为它具有良好的局部性,很少发生跳跃式访问。


文章有不对的地方还请大佬们指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值