@C++
大家好,这是我第一次网上写博客,兴趣使然,欢迎多家指点!
C++实现快速排序法
快速排序
首先,关于快速排序法的定义,就不多说了,将目光放于数组的话,快速排序就是将一个数组中大小不一的一组数按照从大到小或者从小到大的顺序排列出来。至于快速这两个字是相对的(时间复杂度),相对于木桶法和冒泡法会更加快速的达到排序的需求。
过程实现
至于如何实现这个过程,在一组数组中,我们必须要先找到一个基准数(用来参照的数)。例如有以下数组“6 1 2 7 9 3 4 5 10 8”,这个数组我们将第一个数“6”为基准数,其他的数来参照它。
首先,我们将这个数组中所有比“6”大的数字,放在6的右边,所有比“6”小的数字,放在6的左边。这个时候数组就会变成“3 1 2 5 4 6 9 7 10 8”,如何变成这样的呢?我们再返回最初的数组“6 1 2 7 9 3 4 5 10 8”,我们将“6”作为基准数,这时候我们需要两个“哨兵”(一个从左往右,一个从右往左),这两个哨兵用来查找大于基准数的数和小于基准数的数。
1、此时我们让两个哨兵一个先从右往左开始找小于”6“(基准数)的数,找到了后停下。再让另一个哨兵从左往右开始寻找大于”6“的数,找到后停下,此时交换这两个数的位置。然后两个哨兵继续刚才的动作,再相互交换,直到两个哨兵相遇的时候,也就是下标相同的时候停止(可以记住这里停止)。从数组来看,此时数组是“6 1 2 5 4 3 9 7 10 8”。(可以拿手比划一下)
2、当两个哨兵值停止时(两个哨兵在一个下标),我们将哨兵停下来的下标与我们最初定的基准数位置互换。从数组来看,此时数组是“3 1 2 5 4 6 9 7 10 8”。
3、上面数组看到,6往左的都比6小,6往右的都比6大。这时,我们将这个数字拆成两个部分,一部分是6之前的部分“3 1 2 5 4”,基准数定为3,一部分是“9 7 10 8”基准数定为9。这两个部分再重复步骤1与步骤2,分别变成“2 1 3 5 4”和“8 7 9 10”。再将这两个部分以基准数为中线分开,继续重复…
4、最后得到“1 2 3 4 5 6 7 8 9 10”。快速排序的过程就是先定基准数,大于基准数放一边,小于基准数放另一边。再将基准数与哨兵下标的数互换,再重复,直到完成排序。
细节处理
在编程之前,我们要处理很多细节,首先细品为什么要右边的哨兵值先走?(因为设置的基准数为最左侧的数)再品一品我们一共走了多少轮?(有没有一种递归的感脚?)
上代码!
///快速排序法
#include<iostream>
using namespace std;
int n