python 快速排序详解_学习笔记——快速排序(python实现)

本文详细解析了快速排序算法的原理与实现过程,包括如何选取基准值、如何通过指针操作进行数组分割以及递归排序的方法。在代码实现部分,展示了如何编写快速排序函数,并解释了代码中关键步骤的作用。此外,还提到了在实际编程中可能遇到的问题及解决思路,加深了对快速排序的理解。
摘要由CSDN通过智能技术生成

快速排序是各类面试笔试所必须要掌握的知识点。面试官可能会要求你现场手写代码,笔试中出现的概率也十分高,这就要求熟练掌握此类排序原理,首先,来介绍一下快速排序的原理。

快速排序,是指将一组无序数组按照一定的规律,排序成有序数组。该算法的核心思想为:

1.随机找出一个基准值,让其他的数与此基准值相比较,将数组分割成两部分,(大于基准值的数为一部分,小于基准值的数为另一部分)

2.在这两部分再分别找出基准值,重复步骤1进行分割。

3.重复上述步骤,直至不可分割。

1.在快速排序中基准值往往是数组中的第一个数,所以我们首先将基准值赋值给一个变量mid。

2.通过原理分析不难发现,该过程需要进行逐一比较,即我们从数组中的最后一个数开始,逐一将其与mid相比(指针实现即可)。

3.若待比较数大于等于mid,则将指针向左移动。

4.当遇到小于mid的数时,则将该数赋值给数组中的第一个数(即数组中等价于mid的那个数的位置)

5.然后继续让数组中的数与mid相比较(注意,赋值过后比较是从数组的第一个数开始与mid相比)

6.若待比较数小于mid。则指针像右移动。

7.当遇到大于mid的数时,则将该数赋值给(上次进行主动赋值数的位置)

8.最后将mid值赋值回去。

9.至此完成一趟排序,递归重复该过程。

93440ac06c333643c238ebd290b3ac9d.png

def quick_sort(li, start, end):

# start=end ,证明要处理的数据只有一个

# start>end ,证明右边没有数据

if start >= end:

return 0

# 定义两个指针,分别指向0和末尾位置

left = start

right = end

# 把0位置的数据,认为是中间值

mid = li[left]

while left < right:

# 让右边游标往左移动,目的是找到小于mid的值,放到left游标位置

while left < right and li[right] >= mid:

right -= 1

li[left] = li[right]

# 让左边游标往右移动,目的是找到大于mid的值,放到right游标位置

while left < right and li[left] < mid:

left += 1

li[right] = li[left]

# while结束后,把mid放回到中间位置

li[left] = mid

# 递归处理左边的数据

quick_sort(li, start, left-1)

# 递归处理右边的数据

quick_sort(li, left+1, end)

if __name__ == '__main__':

l=input('请输入待排序的数组:')

llist=l.split(',')

llist= [int(llist[i]) for i in range(len(llist))] #强制转换成int型加入到数组中

quick_sort(llist,0,len(llist)-1)

print(llist)

遇到的问题:

1.想不明白为什么第一个while循环为什么是li[left]=li[right],而不是li[right]=li[left]

答:因为此过程为二分法,小于mid的值都要移到mid前,所以是对left指针所指的值赋值。第二个while循环同理。(大于mid值要在mid右侧,所以是对right指向的位置进行赋值)

2.为什么while循环后,li[left]=mid?

答:因为上述过程中mid的值已经不在数组中,需要将其赋值回去,而此时基准值的位置是li[left]。

3.递归为什么是这么实现的?

答:因为该过程是不断的对mid两侧区域内值重复此过程(不包括基准值)

学到的东西:

1.注意if__name==__main__是两个下划线,写一个不会报错,但无结果(找了半天才发现是这里马虎了)

2.注意递归函数结束条件的设定,在这里是当区域内只有一个数,即可停止比较,即指针start>=end。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值