快速排序C++实现

最近在看《剑指Offer》这本书,也在为找工作做一些准备,今天在书上看到排序在面试当中的重要性,所以下决心要好好搞一下

于是晚上回到实验室看了看《算法导论》中关于快速排序这一块的内容,作者讲的还是蛮详细的,后来借鉴网上的代码实现了一下,写下这篇文章,记录自己的学习过程。

快速排序是一种最坏情况时间复杂度为O(n2)的排序算法,虽然最坏情况时间复杂度很差,但是快速排序通常是在实际排序应用中最好的选择,因为它的平均性能非常好:它期望时间复杂度是Ο(n log n) ,而且Ο(n log n) 中隐含的常数因子非常小。

最坏情况划分:当划分产生的两个子问题分别包含了n-1个元素和0个元素时,快速排序的最坏情况发生了。

下面是对一个典型的子数组A[p,r]进行快速排序的三步分治过程:

分解:数组A[p,r]被划分为两个子数组A[p,q-1]和A[q+1,r],使得A[p,q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1,r]中的每个元素。其中,计算下标q也是划分过程的一部分。

下面的程序实现快速排序:

QUICKSORT(A,p,r)

if p<r

q=PARTION(A,p,r);

QUICKSORT(A,p,q-1);

QUICKSORT(A,q+1,r);

下面是PARTION过程:

PARTITION(A,p,r)

x=A[r];

i=p-1;

for j=p to r-1

if(A[j] <= x)

++i;

swap(A[i],A[j]);

swap(A[i+1],A[r]);

return i+1;

下面就贴出代码吧,在VS2012下测试通过的


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值