C++泛型编程 快速排序的函数模板实现
来源:互联网 发布:淘宝上的尿不湿能买吗 编辑:程序博客网 时间:2024/04/27 22:36
说在前面的废话
话说快一年没写过博客了。。。
在建站之前就先用csdn写吧
这次要说的东西也没有啥,主要是想写一次快排(学了这么就快排都没写过你敢信
用法类似于stl里面的sort,有两个版本。
不知道为什么写了很长时间。。。这么短的代码
还是感觉数组版的好写一点
学过快排的同学可以不用看下面这段了
快排的基本思想
1.选取一个基准
2.将比它”小”的放在它前面,比他“大”的放在后面(广义的小和大)
3.递归处理前面那一段和后面那一段
实现步骤
函数传入的是指向第一个元素的迭代器(
还可以传入一个比较函数(
考虑快排的操作:
1.选定一个基准
我们选择第一个元素的值作为排序的基准,把它的迭代器记作 temp
然后记录一前一后两个迭代器,记作front和back。
2.整理
每一轮,我们用back迭代器从后向前遍历,直到当前元素的值小于temp指向元素的值,然后交换他们的值,并让temp指向现在的位置再使back向前移动一次;随后对front迭代器进行类似的操作。
持续进行上面的操作,直到front和back间没有元素,即所有元素都被遍历过。
3.递归处理
temp所在的元素已经是其应该在的位置,所以只需要处理begin~temp 和 temp+1~end这两个区间的
代码
#include <iostream>#include <vector>using namespace std;template <typename _T>void _swap(_T& _a, _T& _b){ _T temp = _b; _b = _a; _a = temp;}template <typename _Random_Access_Iterator>void my_quick_sort(_Random_Access_Iterator _begin, _Random_Access_Iterator _end){ if (_end - _begin <= 1) return; _Random_Access_Iterator _temp = _begin; _Random_Access_Iterator _front = _begin; _Random_Access_Iterator _back = _end - 1; while (true) { while (_back - _front >= 0) { if (*_back < *_temp) { _swap(*_back, *_temp); _temp = _back; _back--; break; } _back--; } while (_back - _front >= 0) { if (*_temp < *_front) { _swap(*_temp, *_front); _temp = _front; _front++; break; } _front++; } if (_back - _front < 0) break; } my_quick_sort(_begin, _temp); my_quick_sort(_temp + 1, _end);}template <typename _Random_Access_Iterator, typename _Compare>void my_quick_sort(_Random_Access_Iterator _begin, _Random_Access_Iterator _end, _Compare _comp){ if (_end - _begin <= 1) return; _Random_Access_Iterator _temp = _begin; _Random_Access_Iterator _front = _begin; _Random_Access_Iterator _back = _end - 1; while (true) { while (_back - _front >= 0) { if (_comp(*_back, *_temp)) { _swap(*_back, *_temp); _temp = _back; _back--; break; } _back--; } while (_back - _front >= 0) { if (_comp(*_temp, *_front)) { _swap(*_temp, *_front); _temp = _front; _front++; break; } _front++; } if (_back - _front < 0) break; } my_quick_sort(_begin, _temp, _comp); my_quick_sort(_temp + 1, _end, _comp);}template<typename _T>bool compare(const _T& a, const _T& b){ return a > b;}int main(int argc, char** argv){ vector<int> a={95,1,4,2,6,9,3,6562,324,54,32243,123,43,657457,100,43}; my_quick_sort(a.begin (), a.end (), compare<int>); for (auto i : a) { cout << i << endl; } size_t t; cin >> a[1]; return 0;}
0 0
- C++泛型编程 快速排序的函数模板实现
- 快速排序的模板实现
- 快速排序函数模板
- 快速排序----模板实现
- 快速排序的c实现
- 快速排序的c实现
- C语言快速排序模板大全(qsort函数)
- 快速排序模板方法,只实现了int比较的仿函数
- 趣味编程:函数式链表的快速排序
- [C++] 冒泡排序的模板函数设计
- C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序
- 编程实现快速排序
- C++模板实现快速排序
- 模板与泛型编程之实现(归并排序)
- 快速排序c实现
- 快速排序C实现
- 快速排序C实现
- 快速排序C实现
- http post方式上传文件
- udacity上Google的深度学习笔记
- Java线程(7)
- Apache服务器的下载与安装
- MyBatis 灵活的ORM框架
- C++泛型编程 快速排序的函数模板实现
- jsp 怎么写
- 代理模式及Java实现动态代理
- 去掉windows开机选择系统的选项(以win10为例)
- 负载均衡
- 使用Apache,配置modSSL,使其支持https访问
- opnet之packet/link/transceiver
- Java 动态代理机制分析及扩展,第 1 部分
- RN实现iOS tableview分组吸顶效果