【Python数据结构与算法】快速排序

提要

记录学习快速排序算法时遇到的问题(基于Pyhton)

问题

  • 主要接触了两种方法
    • 从待排序列表中选出基准元素(任选),创建两个空列表a和b,将待排序的列表中每个元素与基准元素相比较,小于等于基本元素的从待排序列表移除添加进列表a,大于基本元素的从待排序列表移除并添加进列表b,最后拼接成一个列表即 a+基准元素+b ,再对列表a与列表b进行重复操作,直到列表中只剩下一个基准元素。
    • 从待排序列表中选出基准元素(任选),设置两个游标a和b。a从列表最小索引移向最大索引,步长为1;b从列表最大索引移向最小索引,步长同样为1;首先移动b,在移动过程中寻找第一个小于基准元素的元素,然后停止;然后移动a,在移动过程中寻找第一个大于基准元素的元素,然后停止。最后将a与b找到的元素互换位置,进行下一次寻找。在移动过程中,若a与b相遇,则停止本次移动,进行下一次移动
  • 主要问题
    • 方法1(创建列表)虽然很好理解,但是在编写代码时遇到了一些障碍,递归函数实现总会遇到一些问题。
    • 方法2(设置游标)在编写过程比较简单,但是由于实现方法太过于多样,很容易造成记忆混乱,而且初次接触时理解起来可能有一些难度

代码

方法2(设置游标)代码

# 快速排序

# 定义函数,传入参数为列表,左游标值以及右游标值
def quick_sort(list, left, right):
    # 当左游标值 > 右游标值时退出函数(递归出口)
    if left > right:
        return -1
    # 设置基准值
    pivot = list[left]
    i = left
    j = right
    # 首要条件,左右游标值不能相等
    while i != j:
        # 当j即右游标指向值大于等于基准值时且左游标值小于右游标值,右游标向左移动
        while list[j] >= pivot and i < j:
            j -= 1
        # 当i即左游标指向值小于等于基准值时且左游标值小于右游标值,左游标向右移动
        while list[i] <= pivot and i < j:
            i += 1
        # 双游标都停止后如果左游标值小于右游标值,则两游标所指向元素互换位置
        if i < j:
            list[i], list[j] = list[j], list[i]
    
    # 将左游标的值赋值等于左游标最后停留的值
    list[left] = list[i]
    # 将左游标最后停留处的值赋值等于基准值
    list[i] = pivot
    # 分别对基准值左边以及右边的值进行排序
    quick_sort(list, left, i - 1)
    quick_sort(list, i + 1, right)

a = [4, 2, 7, 8, 0, 1, 5, 23, 78, 29]
quick_sort(a, 0, len(a)-1)
print(a)

总结

  • 方法2掌握的并不理想,有几处还需思考
  • 熟练方法2当前实现方法后尝试新的实现方法
  • 尝试理解并实现方法1

猜你喜欢

转载自www.cnblogs.com/lan-notebook/p/12166936.html