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

说在前面的废话

话说快一年没写过博客了。。。
在建站之前就先用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 
#include 

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;
}

你可能感兴趣的:(快速排序,函数模板,泛型编程)