快速排序python(递归)

作者: 楠木cral | 来源:发表于2020-09-10 17:52 被阅读0次

    快速排序(英语: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)
    稳定性:不稳定

    相关文章

      网友评论

        本文标题:快速排序python(递归)

        本文链接:https://www.haomeiwen.com/subject/flmpektx.html