快速排序算法的详细讲解(代码较晦涩不易理解,但时间复杂度低,效率好的方法)

代码中包含大量的注释,可以参考,这里不再赘述

改天再写一个代码简单易于理解的快速排序算法,但是时间复杂度要高一些

# 使用快速排序对下面的列表按升序排序
alist = [30, 24, 5, 58, 18, 36, 12, 42, 39]


def sort_value(alist, start=0, end=len(alist) - 1):
    '''
    :param alist: 需要进行排序的列表
    :param start: 默认开始位置为列表的第一个元素的下标
    :param end: 默认结束位置为列表的最后一个元素的下标
    :return:
    '''

    # 如果列表只有一个元素,或者
    if start >= end:
        return

    # 定义一个指针mid,并且把指针初始指向到列表的第一个元素
    mid = alist[start]
    # 定义一个指针pre 指向列表start位置
    pre = start
    # 定义一个指针next 指向列表的len(alist)-1位置
    next = end

    # 如果pre指针在前, next指针在后, 进入循环
    while pre < next:
        # 如果列表的next所指向元素大于mid指向的元素, 那么next所指向的元素位置不动
        while alist[next] > mid and pre < next:
            # 并且把next指针向前移动一位
            next -= 1
        # 如果进入了上面循环,那么在next-1之前指针所指向的元素位置不动,并且把next-1之后指针所指向的元素位置放到pre指针的位置
        # 如果没有进入上面的循环,那么就把next指针所指向的元素赋值到pre指针的位置
        alist[pre] = alist[next]
        # 如果列表的pre所指向的元素小于或等于mid指向的元素,那么pre所指向的元素位置不动
        while alist[pre] <= mid and pre < next:
            # 并且把pre指针向后移动一位
            pre += 1
        # 如果进入了上面循环,那么在pre + 1之前指针所指向的元素位置不动,并且把pre+1之后指针所指向的元素位置放到next指针的位置
        # 如果没有进入上面的循环,那么就把pre指针所指向的元素赋值到pre指针的位置
        alist[next] = alist[pre]
    # 循环往复上面的步骤,直到pre指针和next指针重合,进不去上面的循环,那么就把mid所指向的元素赋值到他们所在的位置
    # 这里也就是把mid放到了最中间的位置
    alist[pre] = mid

    # 这里回调上面的函数,把左右两边的元素分别排序
    sort_value(alist, start, next - 1)
    sort_value(alist, pre + 1, end)


sort_value(alist)
print(alist)

你可能感兴趣的:(Python,快速排序,排序算法,python,排序)