C++泛型编程 快速排序的函数模板实现

来源:互联网 发布:淘宝上的尿不湿能买吗 编辑:程序博客网 时间:2024/04/27 22:36

说在前面的废话

话说快一年没写过博客了。。。
在建站之前就先用csdn写吧

这次要说的东西也没有啥,主要是想写一次快排(学了这么就快排都没写过你敢信

用法类似于stl里面的sort,有两个版本。

不知道为什么写了很长时间。。。这么短的代码
还是感觉数组版的好写一点

学过快排的同学可以不用看下面这段了

快排的基本思想

1.选取一个基准
2.将比它”小”的放在它前面,比他“大”的放在后面(广义的小和大)
3.递归处理前面那一段和后面那一段

实现步骤

函数传入的是指向第一个元素的迭代器(begin)和指向最后一个元素后一个的迭代器(end)
还可以传入一个比较函数(comp)

考虑快排的操作:

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
原创粉丝点击