快速排序(Java)

177 阅读2分钟
  • 原理
    • 快速排序采用分而治之的思想
    • 在快速排序的过程中选择一个基准点,通过基准点将数组分为两个分区
    • 左分区中元素都小于基准点,右分区中元素都大于基准点
    • 之后在分别对左右分区重复上述步骤,直到分区中元素排序完成后,整个数组排序完成
  • 实现方式
    • 单边指针
      • 流程
        • 选择数组中最右边元素当作基准点,将数组中左侧元素索引作为交换位置
        • 从交换位置开始进行遍历寻找比基准点小的元素
        • 当遇到比基准点小的元素时与被交换位置的元素进行交换并且交换位置的索引 + 1
        • 当遍历结束后,将基准点与被交换位置元素进行交换
        • 此时基准点左分区元素都小于基准点,右分区元素都大于基准点
        • 在对左右分区重复上述步骤,直到数组排序完成
      • 流程图
        • 紫色代表基准点
        • 蓝色代表被交换的索引位置
        • 绿色代表当前被比较的元素 单指针快排.png
      • 代码演示 单指针快排代码.png
    • 双边指针
      • 流程
        • 选择数组中最左侧元素作为基准点,定义两个指针分别从数组左侧和右侧出发
        • 首先右侧指针向左查找小于等于基准点的元素,记录当前元素的索引位置
        • 左侧指针向右寻找大于基准点的元素,记录当前元素的索引位置
        • 两个元素进行交换位置,交换位置之后继续重复上述步骤
        • 当右侧指针与左侧指针重叠时结束循环,将基准点与重叠位置进行交换
        • 此时基准点左分区元素都小于基准点,右分区元素都大于基准点
        • 在对左右分区重复上述步骤,直到数组排序完成
      • 流程图 双边快排.png
      • 代码演示 双指针快排代码.png
      • 注意事项
        • 在循环开始时右指针要先进行移动,避免在左右指针发生重叠时进行交换将大的元素交换到基准点位置,造成排序混乱
        • 在指针遍历时要判断左右指针是否重叠,避免排序混乱
        • 左指针要寻找大于基准点的元素索引位置因为左指针是从基准点开始遍历的,会造成排序错误
  • 特点
    • 时间复杂度为O(n2)

    • 属于不稳定排序算法