快速排序算法_面试现场:写一下快速排序算法

9308c96638f2e869e7caed8ecc19c360.png

点击上面图片,浏览算法设计与分析教学大纲

算法概述

快速排序(Quicksort),又称划分交换排序,简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要O(n log n)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。

事实上,快速排序O(n log n)通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。

算法流程

快速排序使用分治法策略来把一个序列分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

  1. 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),

  2. 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,

  3. 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

快速排序的代码步骤可以被划分为5步:

public void quick(int arr, int head, int tail) {

示例代码

public 

打印输出:

1, 

在程序运行中,可以通过打印排序前和排序后的数列观察运行流程

[6 1 2 7 9 3 4 5 10 8 ] 排序, 排序后 

时间复杂度

数组有n个元素,因为要递归运算,算出支点pivot的位置,然后递归调用左半部分和有半部分,这个时候理解上是若第一层的话就是n/2、n/2,若是第二层就是n/4、n/4、n/4、n/4这四部分,即n个元素理解上是一共有几层2^k=n,k=log2(n),然后每层都是n的复杂度,那么平均就是O(nlog2 n)的时间复杂度。但这种肯定是平均情况,如果你是标准排序的情况下,如果已经是升序的顺序,那么递归只存在右半部分了,左半部分都被淘汰了。(n-1)(n-2)….*1,这个复杂度肯定就是O(n^2)

空间复杂度

快排的实现是递归调用的, 而且每次函数调用中只使用了常数的空间,因此空间复杂度等于递归深度。

最好的情况最多需要O(log2 n)次的嵌套递归调用,所以它需要 O(log2 n)的空间。最坏情况下需要O(n)次嵌套递归调用,因此需要 O(n)的空间。 593b7f10c1a2a0048a5c9edea8d9584a.gif

4f8fb3e3efc334a1507e24929a12cb64.png

b10d6e48c05520935ab6a7a828f7b7f3.png

扫码,京东优惠购书

大礼包:凡是在京东购书并评价的(必须有评价),请将截图发到邮箱:itbook8@163.com,免费获取额外赠送的ACM题库资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值