排序算法之二:快速排序

1、快速排序的描述

像合并排序一样,快速排序也是基于分支模式的,下面是对一个典型子数组A[p..r]排序的分支过程的三个步骤:
(1)分解:使用下标q,用A[q]将数组A[p..r]划分为两个子数组(A[p..q-1]和A[q+1..r]),其中A[p..q-1]中的所有元素都小于等于A[q],A[q+1..r]中的所有元素都大于等于A[q],q通过划分过程求得;
(2)解决:递归调用快速排序,对分解得到的两个子数组进行排序;
(3)合并:因为两个子数组是就地排序的,所以递归之后得到的A[p..r]就是已排好序的数组。


2、算法

QUICKSORT(A,p,r)
    if p<r
        then q = PARTITION(A,p,r)
            QUICKSORT(A,p,q-1)
            QUICKSORT(A,q+1,r)

排序一个完整的数组A,最初调用的是QUICKSORT(A,1,length[A]).
数组划分是快速排序算法的关键,数组划分算法如下:

PARTITION(A,p,r)
    x=A[r]
    i=p-1
    for j=p to r-1
        do if A[j]<=x
            then i=i+1 
                exchange(A[i],A[j])
    exchange(A[i+1],A[r])
    return i+1
PARTITION(A,p,r)
    x=A[r]
    i=p-1
    for j=p to r-1
        do if A[j]<=x
            then exchange(A[++i],A[j])
    exchange(A[++i],A[r])
    return i

数组划分算法参照下图会很容易理解,只要时刻记住i指向的是<=x的子数组的最后一个元素,而j指向的是待被划分子数组的第一个元素,该算法就比较easy啦。


这里写图片描述


3、算法实例

(1)动态演示过程:


这里写图片描述
图2 快速排序示意图

(2)算法实例:

这里写图片描述
图3 快速排序实例


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值