思想:分而治之
#include<iostream>
using namespace std;
template<typename T>
int partition(T a[], int l, int r) {
T tmp = a[l];
int k = l;
for (int i = l + 1; i <= r; i++ ) {
if (a[i] < tmp) {
k++;
swap(a, i, k);
}
}
swap(a, l, k);
return k;
}
template<typename T>
void quickSort(T a[], int l, int r) {
int mid = partition(a, l, r);
quickSort(a, l, mid);
quickSort(a, mid + 1, r);
}
优化
- 在递归底层元素较少的时候,使用插入排序,这一点和归并排序是一致的;
- 快速排序在最糟糕的情况,即逆序数组的时候,递归的深度会增加,此时快速排序算法的时间复杂度就退化为 O(n^2)。解决办法很简单:随机选择一个元素作为标定点,即:我们在每一次迭代开始之前,随机选取一个元素作为基准元素与第 1 个元素交换
// 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
swap( arr[l] , arr[rand()%(r-l+1)+l] );
T v = arr[l];
int j = l;
双路快排
在有很多重复元素的情况下,放在中间的那