快速排序 常考排序算法

冒泡排序是交换排序,它是非常慢的,比起几种简单排序,例如选择,插入排序。冒泡排序的时间性能要差的多。因为总要交换数据,只是两个两个的比,不仅逻辑判断多,交换数据的频次也高。

 但交换排序就如此失败吗。不,它反而是很成功的,因为它有个顶梁柱。那就是快速排序。
 快速排序听着就很快,实际效果来说更快,如果再加入优化,那就快上天了,如果再把几种优化一融合。也许,这就是排序中的王者吧!
今天先不谈及优化,就拿最原始的快排来说。先学着走才能跑啊。太急于求成会摔跟头的。
我们知道冒泡排序总是两个两个比,反序交换,顺序就使遍历往后走。
这种方法太过原始了。
所以我们就想如何能升级一下呢。
因此有了快速排序

快速排序是什么原理呢,就是把数列分成无数个小段,使每段都有序,且第n-1个小段的最后一个数总比第n个小段的第一个数要小(或相等)。这样下来不就有序了吗。

分段很简单,随便的递归和循环就可以做到,但是 令初次接触快排的人 毫无头绪的是,怎么才能做到在每段都有序的情况下
使前面的段的结尾  比  后面的段的开头
 小呢?
我们可以在分的时候做些手脚,那就是使分段那个点左边的数据全部小于此点,右边的数据全部大于此点。
那就有人会想,那虽然保证了右半段的最小的数据也比左边最大的数据要大,但却不能保证每段数据的有序性啊。
比如 9 8 1 2 5  6  7 3 4
 数列以5为枢点划分下来 是 3  4
 1  1  2
     5
      6 7 8
 9
 但5的左右两段数列怎么排序呢。
难道还要引入其他的排序方法来辅佐吗?
其实不用引用其他的排序,(但如果优化会用到,目前先不说)
我们只要将它们不断的分下去,直到每段的长度为1,那不就每段数列都有序了吗(一个数据的数列是有序的),而且也保证了后一段比前一段大。那不就是每前一个数比后一个数小吗。如果是升序,那不就有序了吗。
所以说快速排序的分而治之的思想使用递归来理解是很简单的,因此本次算法就使用了递归,当然循环也是可以的,其实循环更高级,相当于对快速排序的一种优化!
以下为代码:
快速排序---排序中的强者

以下为一次Quick图解
快速排序---排序中的强者

最后返回i的值,即中间数的下标(分段点,枢点)
以下为10万个随即数据测试:
快速排序---排序中的强者

时间复杂度   最好情况 和平均情况 为0(nlog2n)  
最差情况为 0(n^2)
快速排序是不稳定的,不但指 保证相同数据
前后关系的稳定性是不稳定的,也指它排序的性能其实也并不稳定,对于完全乱序,数据很多的数列来说,它是很强悍的。但对于短小的数据,或者基本有序的数据来说,它由于多次递归和很多逻辑判断逻辑循环,它甚至不如简单排序来的快。所以说目前来说并没有完全完美的排序方式,即使给快速排序加了很多优化,它的辅助空间也会大大增加,逻辑判断次数也会增多。
为什么说快速排序很厉害,那是因为目前的信息爆炸的时代,大部分情况下需要处理的数据是很多的,也很复杂,这就很对快速排序的胃口。如果你让我定义一个长度为10的数组
让 快速排序 和 直接插入排序比,那就是被吊打。
因此不同的情况选择最适应排序才是最好的。但也不排除一些很通用的排序,比如归并排序,它的效率就非常的稳定,排序的效率不会非常非常快,但也不会非常非常慢。如果对排序时间稳定性有要求的话,归并未尝不是一个很好的选择。