数据结构--知识点12--快速排序

1、定义

理解:

  • 首先将第一个元素找出来,然后设置low、high两个游标,分别从两边开始向第一个元素靠近;
  • 假设首先移动low游标,如果游标指向的元素比当前元素小,继续向右移动,如果游标指向的元素比当前元素大,则停止,开始移动high游标;
  • 开始移动high游标,比较游标指向的元素和当前元素的大小,如果比当前元素大,则继续向左移动游标,如果比当前元素小,则停止,交换low游标所指的元素和high游标所指的元素;
  • 再移动low游标,如此反复,直到low游标和high游标重合,则第一个元素的位置就找到了;
  • 这时第一个元素左侧的都比它小,右侧的都比它大;
  • 接下来在这个元素的左侧和右侧继续相同的操作,直到将所有元素排列好。

2、python实现

def quick_sort(alist,first,last):
    """引入两个起始值和结束值参数,
    因为进行递归操作时,都是在同一个列表中进行,
    每次进行一次新的递归时需要一个新的操作部分的起始和结束
    """
    # 当序列中只有一个元素时,不做操作
    if first >= last:
        return
    #n=len(alist)
    # 设定第一个元素为中间值
    # mid_value=alist[0]
    mid_value=alist[first]
    # low为从左边开始的索引,high为从右边开始的索引
    low=first
    high=last
    # 当指定一个中间值,判断左边都小于它,和右边都大于它时,需要满足的一个大条件
    while low<high:
        # 先从右边开始判断
        while low<high and alist[high]>=mid_value:
            # 当满足大条件且右边元素大于中间值时,high游标向左移动一位
            high -= 1
        # 否则,将右边的小于中间值的值移到左边
        alist[low]=alist[high]
        # 这时high指向的位置为空,所以移动左边
        while low<high and alist[low] <= mid_value:
            # 当满足大条件且low游标所指的元素小于等于中间值时,游标继续向右移动一步
            low += 1
        # 否则,将左边大于中间值的元素移到右边刚刚移走元素的位置
        alist[high]=alist[low]
    # 从循环退出时,low=high
    alist[low]=mid_value
    # 使用递归,同样的算法在中间值左右两部分列表中实现
    # 对low左边的列表执行快排
    #quick_sort(alist[:low-1])
    quick_sort(alist,first,low-1)
    # 对low右边的列表执行快排
    # quick_sort(alist[low+1:])
    quick_sort(alist,low+1,last)

if __name__ == '__main__':
    list=[11,43,2,4,55,78,45,97,56,73,38]
    print(list)
    quick_sort(list,0,len(list)-1)
    print(list)

结果:

[11, 43, 2, 4, 55, 78, 45, 97, 56, 73, 38]
[2, 4, 11, 38, 43, 45, 55, 56, 73, 78, 97]

3、时间复杂度

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(n2)
  • 稳定性:不稳定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值