快速排序,c++ 模板技术表述,完全兼容标准库!!!
2015-06-15 09:47
555 查看
快速排序,c++ 模板技术表述,完全兼容标准库!!!
代码说明了一切,贴代码!!!(封装于名字空间mystd中)
下面是一段测试程序!!!上面的文件命名为"test.h"
代码说明了一切,贴代码!!!(封装于名字空间mystd中)
#pragma once #include<iterator> // std::iterator_traits #include<functional> // std::less #define MYSTD_BEGIN namespace mystd { #define MYSTD_END } MYSTD_BEGIN //名字空间mystd template<class InputIterator> //输入迭代器 void swap(InputIterator first,InputIterator second) { typedef typename std::iterator_traits<InputIterator>::value_type value_type; value_type temp_val = *first; *first = *second; *second = temp_val; } //随机访问迭代器 template<class random_access_iterator,class CMP> void quick_sort(random_access_iterator first,random_access_iterator last,CMP compare) { typedef typename std::iterator_traits<random_access_iterator>::value_type value_type; int n = last - first; if( n == 0 || n == 1) return ; if(n == 2) { if(compare(*first,*(first + 1))) return ; mystd::swap(first,first + 1); return ; } random_access_iterator middle = first + (n - 1) / 2; if(!compare(*first,*middle)) mystd::swap(first,middle); if(!compare(*first,*(last - 1))) mystd::swap(first,last - 1); if(!compare(*middle,*(last - 1))) mystd::swap(middle,last - 1); mystd::swap(middle,last - 1); value_type middle_val = *(last - 1); random_access_iterator first_1 = first; random_access_iterator last_1 = last; first_1++; last_1 -= 2; while(first_1 < last_1) { if(!compare(*first_1,middle_val) && !compare(middle_val,*last_1)) { mystd::swap(first_1++,last_1--); continue; } if(compare(*first_1,middle_val)) { ++first_1; continue; } if(compare(middle_val,*last_1)) { --last_1; continue; } } mystd::swap(first_1,last - 1); quick_sort(first,first_1,compare); // 递归调用 quick_sort(first_1 + 1,last,compare); // 递归调用 } template<class random_access_iterator> void quick_sort(random_access_iterator first,random_access_iterator last) { //默认升序排列 typedef typename std::iterator_traits<random_access_iterator>::value_type value_type; quick_sort(first,last,std::less<value_type>()); //转调 } MYSTD_END // 名字空间mystd
下面是一段测试程序!!!上面的文件命名为"test.h"
#include<iostream> #include"test.h" #include<functional> // std::less,std::greater #include<cstdlib> // rand() #include<vector> using std::cout; using std::endl; int main() { const int mn = 100; std::vector<int> my; for(int i = 0; i < mn; ++i) my.push_back(rand() % 10000); //随机数赋值 cout<<"没有排序的情况"<<endl; for(int i = 0; i < mn; ++i) cout<<my[i]<<"\t"; cout<<endl; cout<<"升序排列的情况"<<endl; mystd::quick_sort(my.begin(),my.end()); // 升序 for(int i = 0; i < mn; ++i) cout<<my[i]<<"\t"; cout<<endl; cout<<"降序排列的情况"<<endl; mystd::quick_sort(my.begin(),my.end(),std::greater<int>()); //降序 for(int i = 0; i < mn; ++i) cout<<my[i]<<"\t"; cout<<endl; system("pause"); return 0; }
相关文章推荐
- tinyxml非常好的实例 --c++解析XML
- 大话设计模式C++版——工厂模式在COM中的典型应用
- 大话设计模式C++版——工厂模式在COM中的典型应用
- c++ string 和 stl算法
- Convert a String In C++ To Upper or Lower Case
- 插入排序算法,c++ 模板技术表述,完全兼容标准库容器!!!
- [c++]字符串类各种操作的实现以及遇到的bug
- c++ 封装库 给c# 调用
- 浅谈C语言C++中可变参数问题!!!
- C++ Circle类
- C++ 64位自定义随机数生成器的使用 <random> 参照C++11
- 经典C语言程序编码-利润计算
- 【C语言】《C程序设计语言》通读摘录
- boost asio学习笔记 [1] - 同步通讯
- 【C语言】程序内存四区
- Tower of Hanoi by C++
- Effective C++ 条款01解读: 视C++为一个语言联邦
- c语言的冒泡排序
- 【C语言】数据类型和变量
- 【C语言】C语言注释转换成C++注释。