Python排序算法之快速排序

快速排序

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

步骤

  • 从数列中挑出一个元素,称为“基准”。
  • 重新排序数列,所有元素比基准小的在元素左边,比基准大的在右边。该基准就处于数列中间位置,这个称为分区操作。
  • 递归地把小于基准值的元素和大于基准的元素排序。

代码实现

# -*- coding: utf-8 -*-


def quick_sort(array):
    """快速排序"""
    if len(array) >= 2:
        mid = array[len(array)//2] # 选取基准值,也可选取第一个或者最后一个
        array.remove(mid)
        left_arr = [] # 基准值左侧的列表
        right_arr = [] # 基准值右侧的列表
        for item in array:
            if item < mid:
                left_arr.append(item)
            else:
                right_arr.append(item)

        return quick_sort(left_arr) + [mid] + quick_sort(right_arr)

    else:

        return array


if __name__ == '__main__':

    arr = [99,55,77,33,11,22]
    print(arr) # [99,55,77,33,11,22]
    print(quick_sort(arr)) # 输出为:[11, 22, 33, 55, 77, 99]
    

上面介绍快速排序算法的写法相对来说比较好理解, 该算法返回一个新的列表,下面介绍另一种写法,该写法从始至终至终都在列表自身进行操作。

# -*- coding: utf-8 -*-

def quick_sort_2(array, first, last):
    """快速排序"""
    if first >= last:
        return

    mid = array[first]
    low = first
    high = last

    while low < high:

        while low < high and array[high] >= mid:
            high -= 1
        array[low] = array[high]

        while low < high and array[low] < mid:
            low += 1
        array[high] = array[low]

        # 循环退出时,low==high
        array[low] = mid


        # 对low左边列表执行快速排序
        quick_sort_2(array, first, low-1)
        # 对low右边列表执行快速排序
        quick_sort_2(array, low+1, last)

if __name__ == '__main__':

    arr = [99,55,77,33,11,22]
    print(arr) # [99,55,77,33,11,22]
    quick_sort_2(arr, 0, len(arr)-1)
    print(arr) # [11, 22, 33, 55, 77, 99]

 时间复杂度

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(n^2)
  • 稳定性:不稳定
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值