快速排序函数模板

这段时间对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;
}
时间: 2024-10-21 10:08:50

快速排序函数模板的相关文章

实验2:函数重载、函数模板、简单类的定义和实现

实验目的 1. 掌握c++中函数的声明.定义.调用和参数传递方式 2. 掌握c++中带有默认形参值的函数声明和定义方法 3. 理解函数重载,掌握c++中函数重载的实现方式 4. 理解函数模板,掌握c++中函数模板的简单使用 5. 理解面向对象的抽象和封装,掌握c++中类的定义.实现和使用方法 实验准备 1. 函数的声明.定义.调用.参数传递方法 2. 带有默认形参值的函数 3. 函数重载 4. 函数模板(9.1.1节 + 9.3节) 其中,9.3节,理解3个常用的排序算法和两个常用的查找算法 5

C++泛型编程之函数模板

泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库).其语言支持机制就是模板(Templates). 模板的精神其实很简单:类型参数化(type parameterized),即,类型也是一种参数,也是一种静多态. 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数. 函

c++知识点总结--函数模板

通用函数可变参模板 用于处理不限定参数的函数 showall(){//空函数,接口,最后结束递归 } template<typename T,typename... Args> void showall(T value,Args ...args){ cout<<value<<endl; showall(args); } template<typename T,typename ...Args> void showall(const T &value,

函数模板特化

#include <iostream> template <typename T> T max(T x, T y) { return x > y ? x : y; } //函数模板特化 template <> const char* max(const char* x, const char* y){ return strcmp(x, y) > 0 ? x : y; } int main(){ std::cout << max(1, 2); st

C++函数模板

C++函数模板允许以任意类型的方式来定义函数.例如,可以这样建立一个交换模板: template <typename AnyType> void Swap(AnyType &a, AnyType &b) { AnyType temp; temp = a; a = b; b = temp; } 在标准C++98添加关键字typename之前,C++使用关键字class来创建模板.也就是说,可以这样编写模板定义: template <class AnyType> voi

第56课 函数模板的概念和意义

1. 发散性问题:C++中的几种交换变量的方法 (1)宏代码块 VS 函数 [编程实验]变量的交换 #include <iostream> #include <string> using namespace std; //宏定义代码块 #define SWAP(t, a, b) do { t c = a; a = b; b = c; }while(0); //定义函数方式 void Swap(int& a, int& b) { int c = a; a = b; b

函数模板友元

;函数模板友元 (即一个类友元的是一个全局函数模板而不是原先的全局函数,需注意类模板传入的类型) 标准带类模板参数 friend void fun1(A<T>& obj); 指定这个A<T>类型的模板有一个这样的朋友函数,那么也就意味着这个函数内部只能由A<T>类型的模板 实例化的类 实例化出来的对象可以访问这个对象的数据成员,不是这个类型的类模板就不能访问 ;code template<typename T> class A{ public: A(

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

函数模板的定制(字符串的比较)

#include<stdio.h> #include<iostream> #include<wchar.h> #include<cstdlib> #include<iomanip> using namespace std; template<class T>           //新定义的类型 T min3(T a, T b, T c) { T min; if(a<b && a<c) { min=a; }