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

快速排序是各类面试笔试所必须要掌握的知识点。面试官可能会要求你现场手写代码,笔试中出现的概率也十分高,这就要求熟练掌握此类排序原理,首先,来介绍一下快速排序的原理。
快速排序,是指将一组无序数组按照一定的规律,排序成有序数组。该算法的核心思想为:
1.随机找出一个基准值,让其他的数与此基准值相比较,将数组分割成两部分,(大于基准值的数为一部分,小于基准值的数为另一部分)
2.在这两部分再分别找出基准值,重复步骤1进行分割。
3.重复上述步骤,直至不可分割。
1.在快速排序中基准值往往是数组中的第一个数,所以我们首先将基准值赋值给一个变量mid。
2.通过原理分析不难发现,该过程需要进行逐一比较,即我们从数组中的最后一个数开始,逐一将其与mid相比(指针实现即可)。
3.若待比较数大于等于mid,则将指针向左移动。
4.当遇到小于mid的数时,则将该数赋值给数组中的第一个数(即数组中等价于mid的那个数的位置)
5.然后继续让数组中的数与mid相比较(注意,赋值过后比较是从数组的第一个数开始与mid相比)
6.若待比较数小于mid。则指针像右移动。
7.当遇到大于mid的数时,则将该数赋值给(上次进行主动赋值数的位置)
8.最后将mid值赋值回去。
9.至此完成一趟排序,递归重复该过程。
学习笔记——快速排序(python实现)_第1张图片

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。

你可能感兴趣的:(python,算法,快速排序,数据结构)