高速分拣函数模板
在这段时间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;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。

浙公网安备 33010602011771号