算法-Python 快速排序的学习过程

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

2、学习插入排序先学习递归
递归要点
1、函数自己调用自己
2、有条件退出

计算n的阶乘,如10!=1×2×3…×9×10
1、0!=1
2、n! = (n-1)! * n

def f(n):
    if n == 0:  # 结束递归条件
        return 1
    else:
        return f(n - 1) * n    # 自己调用自己

3、快速排序一次的过程
数组 listx= [5, 56, 4, 7, 89, 6]
确认基数为最后一个数6
依次与前面的数比较,比较的次数 j 为 0-4
i 为下标左边的都是小于6的,包括下标i
用 j 和6去比较
1)如果大于6,则空过
2)如果小于6,i 加1,把 i 和 j 指向的元素交换位置
i=-1 j=0
5<6
i=0,
[5, 56, 4, 7, 89, 6]

i=0 j=1
56>6
空过 [5, 56, 4, 7, 89, 6]

i=0 j=2
4<6
i=1
i j 交换位置
[5, 4, 56, 7, 89, 6]

i=1 j=3
7>6
空过 [5, 4, 56, 7, 89, 6]

i=1 j=4
89>6
空过 [5, 4, 56, 7, 89, 6]

把下标 i + 1 和最后一个元素交换位置
[5, 4, 6, 7, 89, 56]

实现一次快速排序代码

  def path_sort(lista, sIndex, eIndex):
      i = sIndex-1
      for j in range(sIndex, eIndex):
          if lista[j] > lista[eIndex]:
              pass
          else:
              i += 1
              lista[i], lista[j] = lista[j], lista[i]
      lista[i + 1], lista[eIndex] = lista[eIndex], lista[i + 1]
      print(lista)
      return i + 1  # 返回中位数下标

4、快排递归
1、对listx进行快排
2、对listx左列表5, 4进行快排,对listx右列表 7, 89, 56进行快排
3、直到列表只有一个元素时,则退出

def quickSort(listx):
    def path_sort(lista, sIndex, eIndex):
        i = sIndex-1
        for j in range(sIndex, eIndex):
            if lista[j] > lista[eIndex]:
                pass
            else:
                i += 1
                lista[i], lista[j] = lista[j], lista[i]
        lista[i + 1], lista[eIndex] = lista[eIndex], lista[i + 1]
        return i + 1


    # 算法递归
    def qSort(listb,sIndex,eIndex):
        if sIndex >= eIndex:   # 开始下标大于或等于结束下标,说明列表中只有一个元素,递归结束
            return
        middle = path_sort(listb,sIndex,eIndex)

        # 左子列表递归排序
        qSort(listb,sIndex,middle-1)
        # 右子列表递归排序
        qSort(listb,middle+1,eIndex)
    
    # 调用递归函数
    qSort(listx,0,len(listx)-1)
    return listx

if __name__=="__main__":
    print (quickSort([5, 4, 56, 7, 89, 6]))

执行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值