快速排序算法

 快速排序的依次划分算法从两头交替搜索,直到low和high重合,因此其时间复杂度是O(n),而整个快速排序算法的时间复杂度与划分的趟数有关

        理想的情况是,每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,便可以得到长度为1的子表。这样,整个算法的时间复杂度为O(nlog2n)。

      最坏的情况是,每次所选的中间数是当前序列中的最大或最小元素,这使得每次划分所得的子表中一个为空表,另一个子表的长度为原表的长度-1。这样,长度为n的数据表的快速排序经过n趟划分,使得整个快速排序算法的时间复杂度为O(n2)

       为改善最坏情况下的时间性能,可采用其他方法旋球中间数,通常采用'三者值取中'方法,即比较arr[low],arr[high].与arr[low + high] // 2],取三关键字为中值的元素为中间数。

可以证明,快速排序的平均时间复杂度为O(nlog2n),因此,该排序算法被认为是目前最好的一种内部排序算法

      从空间性能看,尽管快速排序只需要一个元素的辅助空间,但快速排序需要一个栈空间来实现递归。最好的情况下,即快速排序的每一趟排序都将元素序列均匀的分割成长度相近的两个子表,所需栈的最大深度为log2(n+1),但最坏的情况下,栈的最大深度为n,这样,快速排序的空间复杂度为O(log2n).

 

分治法(递归)

#快速排序
class Solution:
    def quickSort(self, arr):
        length = len(arr)
        if (length >= 2):
            midvalue = arr[length // 2]
            arr.remove(midvalue)
            left, right = [], [] 

            for v in arr:
                if v > midvalue:
                    right.append(v)
                else:
                    left.append(v)
        
            return self.quickSort(left) + [midvalue] + self.quickSort(right)
        else:
            return arr  

 

posted @ 2020-09-12 23:22  风不再来  阅读(234)  评论(0编辑  收藏  举报