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