1,快速排序算法大概
(1)快速排序(quick sort)也叫分区排序,是目前应用最广泛的排序算法。在标准C++类库中排序程序被称为qsort,因为快速排序是其实现中最基本的算法。
(2)排序算法的优点:好的快速排序算法在大多数计算机上运行得都比其他排序算法快,而且快速排序算法在空间上只使用一个小的辅助栈,其内部的循环也很小,另外快速排序算法也很容易实现,可以处理多种不同的输入数据,许多情况下它所消耗的资源也比其他排序算法小。
(3)快速排序的注意点:快速排序是一种不稳定的排序方法,即对于排序码相同的元素,排序后可能会颠倒次序。
2,快速排序的实现过程
(1)整体思路:
其基本思想是任取待排序元素序列中的某个元素(例如取第一个元素)作为基准,按照该元素的排序码大小,将整个元素序列划分为左右两个子序列:左侧子序列中的排序码都小于基准元素的排序码,右侧子序列中所有元素的排序码都大于或等于基准元素的排序码。基准元素则排在两个子序列中间(这也是该元素最终应安放的位置)。然后分别对这两个子序列重复实行上述方法(递归过程),直到所有元素都排在相应位置上为止。
(2)思路中的隐含意思
通过思路可以知道,快速排序也叫分区排序的原因。快排的目的就是用一个基准数据对整个待排序的数列“分区”,左区都小于基准,右区都大于基准。那么这就会隐含着一个问题,我们只要达到分区的目的就可以,而不在乎过程;而想把一个数列分出上述符合要求的数列,其过程肯定不唯一,这也就意味着快速排序算法的实现方式不唯一。下面是摘自网友的三种实现方式:
1>方式一:设置两个“哨兵”从序列的两端同时寻找小于基准值和大于基准值得元素,然后交换,最终实现按基准值分区的目的。
原文链接:http://bbs.ahalei.com/forum.phpmod=viewthread&tid=4419&page=1#pid37543
2>方式二:也是从两端进行,但是不像方式一那样同时进行,而是先在右端找到小于基准值得与基准值交换,然后再从左端找到大于基准值的元素填补刚才右端的那个位置,最终也是实现了按基准值分区的目的。
原文链接:
http://blog.youkuaiyun.com/morewindows/article/details/6684558
3>方式三:从一端进行,最终也是为了实现分区的目的。因为这里我主要是实现此方式,所以下面会有详细的介绍。
(3)方式三的具体实现过程
这里结合具体的例子认识其过程,如下面一个无序数列:
1>首先选择21(也就是第一个元素)作为基准元素,我们的目的是把大于21的元素都挪到整个序列的右半部分,把小于21的元素都挪到整个序列的左半部分。
按照方式3