快速排序

思想:

快速排序也是一种交换排序,本质思想都是通过交换序列中的反序,直到没有反序对为止。它采用了分治策略,是对冒泡排序的一种改进。

快速排序的思想如下:分解——把一个元素(如R1)移动到在排序后的文件中它的最终位置上,同时重新排列其他元素,使得不小于R1的元素都位于它的右边,不大于R1的元素都位于它的左边。通过划分,把原来的问题划分为两个子问题。解决——递归调用快速排序算法分别对左边和右边的序列进行排序。合并——空操作,什么也没做。

伪代码:

QuickSort(A,p,r)

         If p<r

                   q=partition(A, p, r)

                   QuickSort(A, p, q-1)

                   QuickSort(A, q+1, r)

 

下面来看其中的partition算法。这个算法也有好几种不同的实现方式。大体可以分为单向划分和双向划分。

单向划分:设选中val作为基元素,A[1,..,i]中的所有元素都小于valA[i+1,…,j]都大于等于val

Partition(A, p, r)

         Val=A[r]

         I = 0, j = 1;

         While(j<r)

                   If(A[j] <= val)

                            i++

                            交换A[i]A[j]

                   j++

         交换A[r]A[i+1]

 

双向划分:设val作为基元素,A[1,…,i]都小于等于valA[j,…,r]都大于等于val

Partition(A, p, r)

         Val = A[p]

         I=p, j=r

         While(I < j)

                   While(i<j A[i] <= val)

                            i++

                   While(A[j] >= val)

                            j--

                   If(i < j)

                            交换A[i]A[j]

                            i++

                            j--

 

算法分析:

快速排序的平均时间复杂度是O(nlgn),最坏时间复杂度是O(n^2)。比如:你要按照非降序排序,输入序列却是按照非升序排列的,如果在partition划分算法中,每次都选取第1个元素作为划分元素的话,那么将发生最坏情况。

快速排序的平均时间复杂度是所有排序中最好的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值