python数据结构与算法

快速排序python(递归)

2020-09-10  本文已影响0人  楠木cral

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤为:

从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

lista = [20,5,15,47,58,25,23,26,14]

def quick_sort(lista, first, last):
    # 递归的退出条件
    if first >= last:
        return
    # 设定起始元素为要寻找位置的基准元素
    mid_value = lista[first]
    # low为序列左边的由左向右移动的游标
    # high为序列右边的由右向左移动的游标
    low = first
    hight = last

    while low < hight:
        # 当hight位的值大于mid_value的值则一直向左移动
        while low < hight and lista[hight] >= mid_value:
            hight -= 1
        # 停止移动要么low与hight重合,要么到了hight位值小于mid_value
        lista[low] = lista[hight]

        while low < hight and lista[low] < mid_value:
            low += 1
        lista[hight] = lista[low]
        # hight -= 1
    # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
    # 将基准元素放到该位置
    lista[low] = mid_value
    # 在做递归的时候没有用切片,是为了保证在做多次递归的时候操作排序的永远只会是这一个列表
    # 先对标志位左边的先进行排序
    quick_sort(lista, first, low-1)
    # 再对标志位右边的先进行排序
    quick_sort(lista, low+1, last)

    return lista
print(quick_sort(lista,0, len(lista)-1))
image.png

时间复杂度

最优时间复杂度:O(nlogn)
最坏时间复杂度:O(n2)
稳定性:不稳定

上一篇下一篇

猜你喜欢

热点阅读