排序算法之快速排序

yishujixiaoxiao 2019-10-23

看题目:

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

总体思路:

1.划分交换排序:从数列中挑出一个元素,称为"基准"(pivot),通常选取每一部分的第一个元素作为基准。 重新排序数列,一右一左的将所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

2.进行递归:递归的(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

3.结束递归:递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

 排序算法之快速排序

 上代码:

def quick_sort(alist, first, last):
    """快速排序"""
    if first >= last:  # 递归退出的条件
        return

    mid = alist[first]  # 设定起始的基准元素
    low = first  # low为序列从开始位置由左向右移动的游标
    high = last # hight为序列从末尾位置由右向左的游标

    while low < high:
        # 如果low与high未重合,high(右边)指向的元素大于等于基准元素,则high向左移动,此处我们的目的是找到比基准小的元素。
        while low < high and alist[high] >= mid:
            high -= 1

        # 走到此位置时,high指向一个比基准元素小的元素,将high指向的元素放到low的位置上,此时high指向的位置空着。
        alist[low] = alist[high]
        # 接下来移动low找到符合条件的元素--比基准元素大的元素--放在high位置处。
        # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动,此处我们的目的是找到比基准大的元素。
        while low < high and alist[low] < mid:
            low += 1
        alist[high] = alist[low]  # 走到此位置时,low指向一个比基准大的元素,将low指向的元素放到high空着的位置上,此时low指向的位置空着。
        # 之后进行下一个循环,移动high找到符合条件的元素--比基准小的元素--放到low位置处。

    # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置,左边的元素都比基准元素小,右边的元素都比基准元素大
    alist[low] = mid  # 将基准元素放到该位置

    # 开始递归
    # 将基准元素左边的子序列进行快速排序
    quick_sort(alist, first, low - 1)  # start:0 low-1 元基准元素靠左边一位
    # 对基准元素右边的子序列进行快速排序
    quick_sort(alist, low + 1, last)  # low+1 : 原基准元素靠右一位  end: 最后


if __name__ == ‘__main__‘:
    # xiaogang = Solution()
    ll = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    n = len(ll)
    quick_sort(ll, 0, n - 1)
    print(ll)

时间复杂度:大部分情况下为O(nlogn),极少数情况下为O(n2)。

空间复杂度:O(logn)~O(n)。相当于以时间换空间。

快速排序算法,相对于其他排序算法最快,相对于归并排序所要花费的辅助空间较少,常用。

相关推荐