数据结构及算法

快速排序的性能和名字一样优秀

2021-05-07  本文已影响0人  Code综艺圈

前言

上次分享的冒泡排序虽然比较简单、容易理解,但每一次冒泡的过程都需要依次比较相邻的元素,然后交换,可见性能还是有很大的优化空间,只要能减少比较次数,性能自然就上去啦;快速排序便是一个很不错的选择~~~

正文

1.1 快速排序算法思想

快速排序(Quicksort)是对上一次分享的冒泡排序算法的一种改进,主要是减少比较次数,以此来提高排序性能;也属于交换排序的一种。

算法思想

1.2 快速排序算法实现与解析

1.3 快速排序算法分析

时间复杂度

从上面解析步骤得知,每一次排序都是只需要处理剩下未排序的元素,每一次排序时间复杂度不会超过O(n),但由于是通过递归进行划分排序,所以快速排序的整体时间复杂度和递归层数有关,即总的时间复杂度为O(n递归层数)*;

通过上面演示得知,其实最终将待排序数据划分为一个二叉树结构,在这二叉树的高度就代表递归的层数(后续会专门分享这块内容),如下图:

image-20210506143932543

关于n个元素的二叉树的最小高度为(log2n)+1,最大高度为n,如果待排序数据已经有序或逆序,如果每次都选择每部分的首个元素为基准值,这样就会导二叉树高度增加,即递归深度就会增加;所以快速排序的时间复杂度最好为O(nlog2n),最坏为O(n2)

这样以为快速排序就不行了吗?当然不是,可以随机选一个元素做为基准值,这样不管待排序数据为有序还是逆序,都不会导致递归深度太深。所以最后快速排序的平均时间复杂度为O(nlog2n)

空间复杂度

空间复杂度在每次递归当中,用到的变量都是固定的(pivot,low,high),则最终影响空间复杂度的因素还是递归层数,则快速排序空间复杂度为O(递归层数), 最好为O(log2n),最坏为O(n)。

稳定性

由于是用待排序数据和基准值进行比较,所以最终元素交换位置不是固定的,则不能保证两个相等元素原有顺序不变,则快速排序是不稳定的。如下图:

image-20210506150331140

如果取low位置的元素3作为基准值,最终会和元素2进行交换,最后就不能保证原来相等元素的前后顺序了。

综上所述,快速排序的时间复杂度为O(nlog2n),空间复杂度为O(log2n),是不稳定算法;

总结

快速排序有效的解决了冒泡排序的缺陷,减少了比较次数,提升了排序性能。但当待排序列表为有序或逆序时,如果单纯的取第一个元素或最后一个元素作为基准值,排序性能并没有提升。所以实现排序算法的关键是需要选个好的基准值,比如可以随机选择,也可以定义一个规则选择,看小伙伴的实现方式咯。

感谢小伙伴的:点赞收藏评论,下期继续~~~

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

上一篇 下一篇

猜你喜欢

热点阅读