首页 > 代码库 > 快速排序函数模板
快速排序函数模板
这段时间对STL比较痴迷,遂做了些许研究,今天把原来写过的快速排序算法用模板函数重新写了一下,把代码贴出来分享一下
有两个版本,版本二可以传入比较器,自己定义排序规则
快速排序算法思路:
1)从序列中选出一个元素作为基准;
2)重排序列,所有比基准小的元素位于基准左侧,比基准大的元素位于基准右侧,和基准相等的元素位于任意一侧,此过程称为分组;
3)以递归的方式对小于基准的分组和大于基准的分组分别进行排序。
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; }
快速排序函数模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。