Python 快速排序

Python 快速排序

# 快速排序
def quick_sort(array, start, end):
    """
    :param array: 待排序列表
    :param start: 开始的位置
    :param end: 结束的位置
    :return:
    1、快速排序主要是对列表的分区也叫分治 从列表中挑选一个元素 作为标志 一般为第一个值为准
    2、指定左指针 列表开始的位置 也就是下标为0的位置
    3、指定右指针 列表结束的位置 也就是洗标为-1的位置
    4、1、选取下标为0的元素,就先移动右指针,存在以下两种情况
            1、找到小于选取得值为准  将小于选取值的元素放到左指针的位置,由于选取值的下标与左指针位置相同直接赋值就可以。之后就可以移动左指针了
            2、右移指针等于了左移指针 代表移动到了最左端说明该值是最大的,此时的右指针等于左指针,那么就不需要 不要左移指针判断 分区结束
    5、1、移动左指针,同样存在两种情况
            1、找到大于选取值的值为准,将大于选取值的元素放到上次右移指针结束的位置 因为上次右移指针上的值已经交换到左指针的位置 ,之后再移动右移指针
            2、左移指针等于右指针,代表左移指针移动到了最右端和右移指针重合,说明选取值在该列表中是最小值 此时左指针等于有指针 交替检查结束
    6、通过上述操作后 将列表分成了 两个区 一个大于该选取数的区 一个小于该选取数的区
    7、重复上述的过程 直到左指针等于右指针
    """
    if start >= end:
        """
        # 该情况就是上述出现的 start:第一次移动右指针等于了左指针 选取的数是该列表中最大的值 结束
        """
        return
    """
    left_pointer:一共三种情况 第一种 第一次进来指定的开始左指针为列表的开头0 
                             第二种 递归调用 分治的选取值的左边的区间也就是小于选取值的区间 开始值同样为0 
                             第三种 递归调用 分治的选取值的右边的区间也就是大于选取值的区间 开始值为上次left_pointer的值+1 不包括上次的选取值
    right_pointer:一共三种情况 第一种 第一次进来为指定的有指针的开始位置即列表的末尾
                              第二种 递归调用 分治的选取值左边的区间,也就是小于选取值的区间 结束值为上次left_pointer-1 不包括上次的选取值
                              第三种 递归调用 分治的选取值右边的区间,也就是大于选取值的区间 结束值为列表的末尾 及end
    axis_value:一共三种情况 第一种 第一次进来为列表下标为0的元素
                           第二种 递归调用 分治的选取值的左边区间,即小于上次选取值的区间 选取的元素为分治后列表开头位置 即下标为0
                           第三种 递归调用 分治的选取的右边区间,即大于上次选取值的区间,选取的元素为分治后上次left_pointer+1 的值                              
    """
    left_pointer = start
    right_pointer = end
    axis_value = array[left_pointer]
    while left_pointer < right_pointer:  # 循环的条件,即左指针小于右指针,说明列表没用分治完成
        """
        选取的元素为列表开头的元素 所以我们先进行右移 条件为左指针小于有指针 并且值要大于等于选取的值
        满足条件,那么右移指针+1 否则说明找到了小于选取值得元素或者左指针等于了右指针,
        因为选取值已经提取出来,所以将left_pointer位置换为该小于选取值的值
        接着进行左移
        """
        while left_pointer < right_pointer and array[right_pointer] >= axis_value:
            right_pointer -= 1
        array[left_pointer] = array[right_pointer]
        """
        选取的值为列表末尾的元素,已经进了右移,进行左移。条件为:左指针小于有指针,并且值要小于选取的值
        满足条件,那么左移指针+1,否则说明找到了大于选取值的元素,或者左指针等于了有指针
        因为右移时的已经将右移指针的值赋值到了left_pointer,所以将该大于选取值的该值赋值于right_pointer
        如果当前left_pointer小于right_pointer 则进行下一次循环
        最后 将选取的值放到left_pointer位置 因为大于选取值的元素已经放到了右边,小于选取值的元素已经放到了左边 
        left_pointer与right_pointer 位置已空 放为选取值
        """
        while left_pointer < right_pointer and array[left_pointer] < axis_value:
            left_pointer += 1
        array[right_pointer] = array[left_pointer]
    array[left_pointer] = axis_value
    quick_sort(array, start, left_pointer - 1)  # 分治左边的数据
    quick_sort(array, left_pointer + 1, end)  # 分治右边的数据
    return array


if __name__ == '__main__':
    array_list = [0, 3, 9, 4, 6, 5, 11, 7, 8]
    print(quick_sort(array_list, 0, len(array_list) - 1))

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值