快速排序算法思路:
1)从序列中选出一个元素作为基准;
2)重排序列,所有比基准小的元素位于基准左侧,比基准大的元素位于基准右侧,和基准相等的元素位于任意一侧,此过程称为分组;
3)以递归的方式对小于基准的分组和大于基准的分组分别进行排序。
下面给出2种排序模板:
一、初级快速排序函数模板
#include<iostream>
using namespace std;
template<class T, int size>
void QSort(T arr[size], int L, int R) {
if (L >= R) //递归终止条件
return;
int i = L, j = R;
int index = i; //这里的基准数取最左边的数
do {
for (; j > index; j--) //从右往左找
if (arr[index] > arr[j]) {
swap(arr[index], arr[j]);
index = j;
break;
}
for (; i < index; i++) //从左往右找
if (arr[index] < arr[i]) {
swap(arr[index], arr[i]);
index = i;
break;
}
} while (i < j);
QSort<T, size>(arr, L, index - 1); //基准数左边部分快排
QSort<T, size>(arr, index + 1, R); //基准数右边部分快排
}
int main() {
int a[10] = { 3,2,1,3,4,5,5,6,10,7 };
QSort<int, 10>(a, 0, 9);
for (int i = 0; i < 10; i++)
cout << a[i] << ' ';
return 0;
}
二、高级快速排序模板(适用范围更广)
1、此方法直接传入2个迭代器(iterator),不需要知道size,可用于各种类型的数组,除了int、char、double、float等基本类型之外,还包括vector、list等STL;
2、重载函数增加了排序函数的传递,可自定义排序规则,这里定义的cmp函数模板是让其逆序排列。如果不传递cmp,则默认排列顺序是从小到大。
#include<iostream>
using namespace std;
template<class iterator>
void QSort(iterator begin, iterator end) {
if (begin >= end) //递归终止条件
return;
iterator L = begin, R = end;
iterator mid = L; //这里的基准数取最左边的数
do {
for (; R > mid; R--) //从右往左找
if (cmp(mid, R)) {
swap(*mid, *R);
mid = R;
break;
}
for (; L < mid; L++) //从左往右找
if (cmp(L, mid)) {
swap(*mid, *L);
mid = L;
break;
}
} while (L < R);
QSort(begin, mid - 1); //基准数左边部分快排
QSort(mid + 1, end); //基准数右边部分快排
}
template<class iterator, class func>
void QSort(iterator begin, iterator end, func cmp) {
if (begin >= end) //递归终止条件
return;
iterator L = begin + 1, R = end;
iterator mid = begin; //这里的基准数取最左边的数
do {
for (; R > mid; R--) //从右往左找
if (cmp(mid, R)) {
swap(*mid, *R);
mid = R;
break;
}
for (; L < mid; L++) //从左往右找
if (cmp(L, mid)) {
swap(*mid, *L);
mid = L;
break;
}
} while (L < R);
QSort(begin, mid - 1, cmp); //基准数左边部分快排
QSort(mid + 1, end, cmp); //基准数右边部分快排
}
template<class iterator>
int cmp(iterator a, iterator b) {//比较函数模版,使排序后顺序排列
return *a < *b;
}
int main() {
char str[] = "eBa8f9n4ichuo21bp7CAOQ3WJZSI5N6D";
int len = strlen(str);
QSort(str, str + len - 1, cmp<char*>);
cout << str;
return 0;
}