• 高速分拣函数模板


    在这段时间STL比较痴迷,然后做一些调查,今天,高速的排序算法最初写模板函数再次写,代码贴分享

    有两个版本号,能够传入比較器,自定义排序规则


    高速排序算法思路:

    1)从序列中选出一个元素作为基准;
    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;
    }
    


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    小程序canvas生成海报-新旧接口
    vue网页小程序实现七牛云图片文件上传以及原生组件video显示不出问题
    【文化课】 一篇魔改英语理解
    python萌新笔记
    版本控制(Version control)
    开源许可证(License)
    agc004c
    python日期时间、时间戳互相转换
    拓展django-haystack全文检索的样式和搜索频率限制
    常用JS代码
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4794235.html
Copyright © 2020-2023  润新知