• 六种常见的排序方法


    #include "iostream"
    #include "vector"
    #include "iterator"
    #include "ctime"
    #include "random"
    
    template<typename T>
    inline void Swap(T & a, T & b){  //交换变量
    	T tmp = a;
    	a = b;
    	b = tmp;
    }
    
    template<typename T>
    inline bool cmp(const T & a, const T & b){  //比较函数
    	return a <= b;
    }
    
    template<typename T>
    void Select_sort(std::vector<T> & v){    //选择排序
    	for (unsigned i = 0; i < v.size() - 1; ++i){
    		int best = i;
    		for (unsigned j = i + 1; j < v.size(); ++j)
                if (cmp(v[j], v[best]))
                    best = j;
    		Swap(v[i], v[best]);
    	}
    }
    
    template<typename T>
    void Bubble_sort(std::vector<T> & v){    //冒泡排序
    	for (unsigned i = 0; i < v.size() - 1; ++i){
    		bool exchange = false;
    		for (unsigned j = v.size() - 1; j > i; --j)
                if (cmp(v[j], v[j - 1])){
                    Swap(v[j], v[j - 1]);
                    exchange = true;
                }
    		if (!exchange) return;
    	}
    }
    
    template<typename T>
    void Insertion_sort(std::vector<T> & v){     //插入排序
    	for (int i = 1, j; i < v.size(); ++i){
    		T key = v[i];
    		for (j = i - 1; j >= 0; --j){
    			if (cmp(key, v[j])) v[j + 1] = v[j];
    			else break;
    		}
    		v[j + 1] = key;
    	}
    }
    
    template<typename T>
    void Shell_sort(std::vector<T> & v){     //希尔排序
    	for(int gap = v.size()/2; gap > 0; gap /= 2)
    		for(int i = gap; i < v.size(); ++i)
    			for(int j = i - gap; j >= 0 && cmp(v[j + gap], v[j]); j -= gap)
    				Swap(v[j], v[j + gap]);
    }
    
    template<typename T>
    void Merge_sort(std::vector<T> & v, std::vector<T> & t, int x, int y){    //归并排序
    	if (y - x <= 1) return;
    	int m = x + (y - x) / 2;
    	int p = x, q = m, i = x;
    	Merge_sort(v, t, x, m);
    	Merge_sort(v, t, m, y);
    	while (p < m || q < y){
    		if (q >= y || (p < m && cmp(v[p], v[q]))) t[i++] = v[p++];
    		else t[i++] = v[q++];
    	}
    	std::copy(t.begin() + x, t.begin() + y, v.begin() + x);
    }
    
    template<typename T>
    void Quick_sort(std::vector<T> & v, int x, int y){    //快速排序
    	if (y <= x) return;
    	int i = x, j = y, m = v[i];
    	while (i < j){
    		while (i < j && cmp(m, v[j])) --j;
    		if (i < j) v[i++] = v[j];
    		while (i < j && cmp(v[i], m)) ++i;
    		if (i < j) v[j--] = v[i];
    	}
    	v[i] = m;
    	Quick_sort(v, x, i - 1);
    	Quick_sort(v, i + 1, y);
    }
    
    int main(int argc, char const *argv[])
    {
    	std::vector<int> v;
    	srand(time(NULL));
    	for(int i = 0; i < 102400; ++i)
            v.push_back(rand());
    	std::vector<int> T(v.size());
    	clock_t start_time = clock();
    	//Select_sort(v);                     //3931MS
    	//Bubble_sort(v);                     //22230MS
    	//Insertion_sort(v);                  //1809MS
    	//Shell_sort(v);                      //31MS
    	//Merge_sort(v, T, 0, v.size());      //15MS
    	//Quick_sort(v, 0, v.size()-1);       //15MS
    	clock_t end_time = clock();
    	std::cout << "Running Time:" << (double)(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "MS" << std::endl;
    	//std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "
    "));  //输出
    	return 0;
    }
    


  • 相关阅读:
    洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
    洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
    Informatica PowerCenter 常用转换组件一览表
    Informatica_(3)组件
    Informatica_(2)第一个例子
    Informatica_(1)安装
    InformaticaPowerCenter调用存储过程
    Informatica 9.5.1 安装配置
    Linux字符集的查看及修改
    Redis-3.2.9集群配置(redis cluster)
  • 原文地址:https://www.cnblogs.com/kunsoft/p/5312712.html
Copyright © 2020-2023  润新知