zoukankan      html  css  js  c++  java
  • 六种常见的排序方法

    #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;
    }
    


  • 相关阅读:
    [置顶] 一个懦弱的IT人
    Android ListView的理解(一)
    不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数
    http-使用get和post方式提交数据
    ILOG的一个基本应用——解决运输问题、转运问题
    原生js获取execl里面的值 主要使用ActiveXObject
    (顺序表的应用5.4.2)POJ 1591 M*A*S*H(约瑟夫环问题的变形——变换步长值)
    HDU 3032 Nim or not Nim? (sg函数)
    Hadoop入门实践之从WordCount程序说起
    仅复制备份(简单恢复模式)
  • 原文地址:https://www.cnblogs.com/kunsoft/p/5312712.html
Copyright © 2011-2022 走看看