首页 > 代码库 > 快速排序函数模板

快速排序函数模板

这段时间对STL比较痴迷,遂做了些许研究,今天把原来写过的快速排序算法用模板函数重新写了一下,把代码贴出来分享一下

有两个版本,版本二可以传入比较器,自己定义排序规则


快速排序算法思路:

1)从序列中选出一个元素作为基准;
2)重排序列,所有比基准小的元素位于基准左侧,比基准大的元素位于基准右侧,和基准相等的元素位于任意一侧,此过程称为分组;
3)以递归的方式对小于基准的分组和大于基准的分组分别进行排序。

#include <vector>
#include <list>
//打印函数模板
template<typename iterator>
void print (iterator begin, iterator end) {
	while (begin != end)
		cout << *begin++ << ' ';
	cout << endl;
}
//交换函数模板
template<typename type>
void my_swap (type& a, type& b) {
	type c = a;
	a = b;
	b = c;
}
//快速排序函数模板,版本一
template<typename iterator>
void my_sort (iterator begin, iterator end) {
	iterator p = begin;
	iterator last = end;  //指向结尾下一个位置
	--last;
	for (iterator i = begin, j = last; i != j;) {
		while (! (i == p || *p < *i))
			++i;
		if (i != p) {
			my_swap (*p, *i);  //交换位置,这里不能赋值,因为不确定数据类型
			p = i;
		}
		while (! (j == p || *j < *p))
			--j;
		if (j != p) {
			my_swap (*p, *j);
			p = j;
		}
	}
	iterator it = begin;
	++it;
	if (p != begin && p != it)   //对小于基准部分递归
		my_sort (begin, p);
	it = p;
	++it;
	if (it != end && it != last)  //对大于基准部分递归
		my_sort (it, end);
}
//快速排序函数模板,版本二(比版本一多了比较器,其它相同)
template<typename iterator, typename comparator>
void my_sort (iterator begin, iterator end,
	comparator cmp) {
	iterator p = begin;
	iterator last = end;
	--last;
	for (iterator i = begin, j = last; i != j;) {
		while (! (i == p || cmp (*p, *i)))
			++i;
		if (i != p) {
			my_swap (*p, *i);
			p = i;
		}
		while (! (j == p || cmp (*j, *p)))
			--j;
		if (j != p) {
			my_swap (*p, *j);
			p = j;
		}
	}
	iterator it = begin;
	++it;
	if (p != begin && p != it)
		my_sort (begin, p, cmp);
	it = p;
	++it;
	if (it != end && it != last)
		my_sort (it, end, cmp);
}
//比较器
class CmpInt {
public:
	bool operator() (int a, int b) const {
		return a > b;
	}
};
int main (void) {
	int na[] = {13, 24, 22, 19, 44, 56, 88, 22};
	vector<int> vi (na, na + 8);  //向量
	list<int> li (na, na + 8);    //列表
	my_sort (na, na + 8);         //测试数组
	print (na, na + 8);
	my_sort (vi.begin (), vi.end ());  //测试向量
	print (vi.begin (), vi.end ());
	my_sort (li.begin (), li.end (), CmpInt ());  //测试列表
	print (li.begin (), li.end ());
	return 0;
}


快速排序函数模板