快速排序是典型的采用分治法进行排序的算法,即将一个长序列分割成短序列进行排序。快排的平均时间复杂度是O(n*log(n))。
快排的核心思想就是每次递归将一个基数放在它在整个序列排列的正确位置,即比它小的值都在他的左边,比它大的值都在他的右边。为了实现这一点,我们需要两个指针spoint和epoint,分别指向序列的起点和终点。spoint从起点向中间遍历,找到比基数大的数(升序排列如此),epoint从终点向中间遍历,找到比基数小的数(升序排列如此),找到之后将两个数交换,从而使较小的数在左边,较大的数在右边,直到spoint和epoint指向同一个数。之后以基数所在位置为基准,将整个序列分割成两个序列,递归执行两个序列。递归终止的条件是当序列长度为1。
每次递归都要进行循环,那么在循环的开始我们便遇到一个问题,spoint所指向的第一个值即基准值究竟是否参与循环内的交换,还是在循环结束时与epoint指向的值进行交换。两种思路均能实现,下面是代码。
第一种:忽略相同的值
template<typename T>
void swap(T &x, T &y){
T temp = y;
y = x;
x = temp;
count ++;
}
template <typename T>
void quickSort(T arr[], int start, int end){