zoukankan      html  css  js  c++  java
  • 高速分拣函数模板

    在这段时间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;
    }
    


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

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4794235.html
Copyright © 2011-2022 走看看