快速排序

算法步骤

快速排序的核心思想是分治算法,将一个规模较大的问题划分成多个规模较小的子问题。首先选定序列中的一个元素(例如,最左或最右的元素)作为轴点(pivot),然后设置左右指针交替的向右和向左移动,将所有比轴点小的元素放在左边的子序列中,所有不小于轴点的元素放在右边的子序列中,直到左右指针相遇,本次循环结束,然后将轴点元素放置于左右指针相遇的位置。至此该轴点的位置已经确定,接下来再按同样的方法处理左右子序列,直到所有元素归位。

性能分析

平均时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度为 O ( 1 ) O(1) O(1)(in place,就地算法,不需要额外的空间)
缺点:

  1. 不稳定性:相同的元素的相对位置会发生变化
  2. 算法的时间复杂度取决于轴点的选择,最差的情况下(每次选择轴点都为最大或最小),快速排序的时间复杂度为 O ( n 2 ) O(n^{2}) O(n2),与冒泡排序相当。改进策略:随机选择序列中的元素作为轴点,降低最坏情况出现的概率,但无法杜绝。

代码实现

版本1

def quickSortRecursive(arr, low, high):
    if low >= high:
        return
    pivot = arr[low]
    left, right = low, high
    while left < right:
        while left < right and arr[right] > pivot:
            right -= 1
        arr[left] = arr[right]
        while left < right and arr[left] <= pivot:
            left += 1
        arr[right] = arr[left]
    arr[right] = pivot
    quickSortRecursive(arr, low, right - 1)
    quickSortRecursive(arr, right + 1, high)

版本2

def quickSortRecursive(arr, low, high):
    if low >= high:
        return
    mid = partition(arr, low, high)
    quickSortRecursive(arr, low, mid - 1)
    quickSortRecursive(arr, mid + 1, high)

def partition(arr, low, high):
    pivot = arr[low]
    mid = low
    for i in range(low, high+1):
        if arr[i] < pivot:
            mid += 1
            arr[mid], arr[i] = arr[i], arr[mid]
    arr[low], arr[mid] = arr[mid], arr[low]
    return mid

参考

代码实现: https://github.com/pgr2015/algorithm_practice/blob/master/sorting/quick_sort.py
算法分析:数据结构与算法–邓俊辉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值