排序算法—————快速排序

本文深入解析了快速排序这一高效排序算法的原理与实现过程。通过实例演示了如何选取中间值,调整数列,使得所有小于中间值的元素位于其左侧,所有大于中间值的元素位于其右侧,以此达到排序目的。同时提供了Python实现代码,帮助读者理解和掌握快速排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是快速排序?

快速排序是一种比较“中庸”的排序方法,它在最好和最坏的情况下的时间复杂度都比较可观。因此,当我们遇到一串数据,不知道用那种排序方法比较合适的时候,可以先用快速排序解决一下问题。甚至,在学会快速排序的算法和代码之后,我们可以把代码背下来,以备不时之需。

如何理解快速排序?

在一串有序的数列中,我们总能找到一个处于中间或类似中间位置的数,在这个数一边的数比它大,另一边的数比它小。那么,在对无序数组排序的时候,我们能否找到这样的一个数,调整另外的数,让比它小的数居于一边,比它大的数居于一边,这样不就能达到排序的目的了吗?这就是快速排序的思想。
我们来举个栗子 对[9, 11, 6, 7, 1]这个数列进行排序,使用快速排序算法是什么样子呢
我们通常选择数列中第一个值或最后一个值作为他的中间值,那么我们从前往后开始遍历数列,这里我们还要引用标记的概念,这里可以理解成一个箭头箭头指向我们列表中的一个数字下面我们将以=代替箭头指向 i 代替箭头
[9, 11, 6, 7, 1] 这里我们第一个数字也就是中间数为9我们此时从9的前面的一个数字开始遍历 因为我们选的中间值在每次循环的过程中只会进行一次交换,交换后数列将以中间值进行分割左边小于右边大于,刚开始我们的 (i —>9)但是这里9大于6所以他们交换,我们所标记的数字也要往前一位指向数字6
[9, 6, 11, 7, 1] (i —>6)9>7
[9, 6, 7, 11, 1](i —>7)9>1
[9, 6, 7, 1, 11](i —>1)这里要注意11不能再进行比较了这是我们的9可以和标记进行交换位置了
[1, 6, 7, 9, 11]数据走到这里我们可以看到原来的数据被我们的9分成了两组【1,6,7,】【11】我们依旧按照上述办法去校验这两个数列从而对元素顺序进行排序得到我们的最终数列
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]

快速排序的python实现

lista= [9, 11, 6, 7, 1]
"""
参数:1st:要被排序的数列,left:我们选取的中间值位置也是数列中的起始位置,right:数列中的最后一个值的位置,position数列中的标记位,div用来保存中间值,a用来保存起始位置
"""
def quickSort(lst,left,right):
    a=left
    div = lst[a]
    position=a
    for i in range(left+1,right+1):#从数列中第二个元素开始遍历列表
        if lst[i] > div:#判断元是否大于中间值
            pass
        else:
            position += 1#标记位进位
            lst[i], lst[position] = lst[position], lst[i]#将大的数忘标记位后面移动
        print(lst)
    lst[left], lst[position] = lst[position], lst[left]#交换标记位和中间值所在位置
    # position = position - 1
    print(lst)
    return position
    pass
def quickSort2(lst, left, right):
    if left >=right:#调用结束的判断条件,无法对数列进行分割
        return
    position = quickSort(lst, left, right)
    quickSort2(lst, left, position-1)
    quickSort2(lst, position + 1, right)
    #递归调用对数列进行分割快速排序
    pass


quickSort2(lista, 0, len(lista)-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值