美文网首页程序员
详解python实现快速排序算法

详解python实现快速排序算法

作者: _icey_ | 来源:发表于2020-10-20 19:15 被阅读0次

    人来人往,蜚短流长,不求此生匆匆过,但求每日在成长

    快速排序严重依赖分区,分区部分完成就代表排序成功了一半

    1、详细思路见代码注释部分:

    def quick_sort(l,low,high):
        '''
        分区的过程:
        low代表左指针,high代表右指针
        1、low会逐个向右移动,遇到大于或等于基准元素时,停止
        2、high会逐个向左移动,遇到小于或等于基准元素时,停止
        3、然后将两指针所指的元素进行交换
        4、重复上述步骤,直到两指针重合,或者左指针在右指针的右边
        5、最后将轴与左指针的值交换位置
        分区的目的:
        使基准元素到正确的位置,然后再把基准元素左右两部分分别进行排序
        '''
        if low >= high:  # 当分出的子列表长度为0或1时,就不会再递归下去了
            return
        pivot = l[high] # 设置初始的基准元素
        inital_low = low # 将初始的low和high存储一下
        inital_high = high
        while low < high:  # 步骤4
            while l[low]<pivot: # 步骤1
                low+=1
            while l[high] > pivot:  # 步骤2
                high -= 1
            l[low], l[high] = l[high], l[low] #步骤3
        l[low],pivot = pivot,l[low] # 步骤5
        
        '''
        分区后,将基准元素左右两部分分别进行排序
        当分出的子列表长度为0或1时,就不会再递归下去了
        '''
        quick_sort(l, inital_low, low-1) #基准左边部分
        quick_sort(l, low+1, inital_high) #基准右边部分
    
        return l
    
    if __name__=='__main__':
        l = [0,5,2,1,6,3]
        print(quick_sort(l, 0, len(l)-1))
    

    2、效率分析
    ①分区步骤中,主要包含

    • 比较:因为每个值都要和基准元素进行比较,所以比较次数为N;

    • 交换:交换的次数则取决于数据的排列情况。一次分区里,交换最少会有1次,最多会有N / 2次,因为即使所有元素都需要交换,我们也只是将左半部分与右半部分进行交换,所以平均下来,粗略估算要进行N/4次交换

      因此,分区步骤次数为N+N/4,大O计数法为O(N)

    ②因为等分发生了log N次,而每次都要对总共N个元素做分区,所以总步数为N×log N。

    因此快速排序算法最佳时间复杂度和平均时间复杂度均为\color{red}{O(NlogN)}
    最佳情况是在基准元素每次都在子列表的中间
    最坏情况是O(N^2)

    由于快速排序在平均情况下表现优异,于是很多编程语言自带的排序函数都采用它来实现。

    参考书目:
    《数据结构与算法图解》作者:[美]杰伊·温格罗

    相关文章

      网友评论

        本文标题:详解python实现快速排序算法

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