参考文章: http://ahalei.blog.51cto.com/4767671/1365285
1.概念
快速排序,听这个名字就能想到它排序速度快,它是一种原地排序(只需要一个很小的辅助栈,注意不是数组),且将长度为N的数组排序所需的时间和NlgN成正比
缺点是:非常脆弱,在实现时一定要注意几个小细节(下面详细讲),才能避免错误。
2.基本思想:
随机找出一个数(通常就拿数组第一个数据就行),把它插入一个位置,使得它左边的数都比它小,它右边的数据都比它大,这样就将一个数组分成了两个子数组,然后再按照同样的方法把子数组再分成更小的子数组,直到不能分解为止。 它也是分治思想的一个经典实验(归并排序也是)
3.快速与归并排序的区别:
(1)归并排序将数组分成两个子数组,然后分别排序,并将有序的子数组归并以将整个数组排序;
快速排序将数组排序的方式是当两个子数组都有序时整个数组也就自然有序了
(2)归并排序的递归调用发生在处理整个数组之前
快速排序的递归调用发生在处理整个数组之后
4.举例说明
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。
3 1 2 5 4 6 9 7 10 8
在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗?
给你一个提示吧。请回忆一下冒泡排序,是如何通过“交换”,一步步让每个数归位的。此时你也可以通过“交换”的方法来达到目的。具体是如何一步步交换呢?怎样交换才既方便又节省时间呢?先别急着往下看,拿出笔来,在纸上画画看。我高中时第一次学习冒泡排序算法的时候,就觉得冒泡排序很浪费时间,每次都只能对相邻的两个数进行比较,这显然太不合理了。于是我就想了一个办法,后来才知道原来这就是“快速排序”,请允许我小小的自恋一下(^o^)。