算法排序-快速排序

快速排序

(英语:Quicksort),又称为交换排序。
通过初始的排序将要排序的数据分割为独立的两部分。

假设要排序的列表是 (A[0]……A[N-1]),首先任意选取一个数据(通常选用列表的第一个数)作为基准数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一次快速排序。

快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

步骤(参考1)

(1) 设置两个变量 left、right,排序开始的时候:left=0,right=N-1;
(2) 以第一个列表元素作为基准数据,赋值给 mid,即 mid=A[0];
(3) 从 right 开始向前搜索,即由后开始向前搜索(right–),找到第一个小于 mid 的值A[right],将 A[right]和 A[left]的值交换;
(4) 从left开始向后搜索,即由前开始向后搜索(left++),找到第一个大于 mid 的A[left],将 A[left]和 A[right]的值交换;

(5 ) 重复第 3、4 步,直到 low=high

步骤(参考2)

视频参考(来源于视频网站(推荐不理解的参考学习,侵权删))

def qukic_sort(colist,l,r):#'导入参数为(list,0,len(list)-1)'
 # 退出条件
    if  l>=r:
        return
    '设定起始元素(基准元素mid)'
    mid=colist[l]
    left=l
    right=r
    while left<right:
        '如果left与right没有重合,且right指向的元素不小于基准元素,则right向左移动'
        while left<right and colist[right]>=mid:
            right-=1
        '将r指针所在的元素放到l的位置上'
        colist[left]=colist[right]
        # print(colist)
        '如果r与l没有重合,且left指向的元素比基准元素小,则left向右移动(即比mid小的都在左侧不变)'
        while left<right and colist[left]<mid:
            left+=1
        colist[right]=colist[left]
        # print(colist)
        '''解释说明操作
        	导入列表a=[123,12,15,648,46,6,464,1]
        	》》 a=[123,12,15,648,46,6,464,1(当前右侧判断位置)]
             123是基准mid
             从右边开始比较,1小于123,应该位于基准的左侧,交换位置,开始判断左侧数据=======
             》》a=[1,12,15,648,46,6,464,1]   
             然后,从左侧开始,1小于mid123,不变,12小123,不变,15也是不变,
             然后648大于123,交换位置===========
            》》 a=[1,12,15,648(当前左侧判断位置),46,6,464,648]    
             然后从右侧开始判断,648大于123,464大于123,不变,然后6小于123,变换===========
             》》 a=[1,12,15,6(左侧位置),46,6(右侧当前判断位置),464,648]   
              然后46小于123,不变,左右判断都到了46右侧的6==========
              '''
    '当l=r的时候,退出循环'
    colist[left]=mid
    ' 然后a=[1,12,15,6,46,123,464,648] '
    '对基准元素左侧的子序列排序'
    qukic_sort(colist,l,left-1)
    '对基准元素右边的子序列进行排序'
    qukic_sort(colist,left+1,r)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值