• 排序之快速排序


    快速排序的在内排中起到比较重要的作用,平均时间复杂度达到O(nlogn)。

    升序快速排序

     1 int partition(vector<int> &vi,int start,int end){
     2     int key=vi[start];
     3     while(start<end){
     4         while(start<end&&vi[end]>=key)
     5             end--;
     6         vi[start]=vi[end];
     7         while(start<end&&vi[start]<key)
     8             start++;
     9         vi[end]=vi[start];
    10     }
    11     vi[start]=key;
    12     return start;
    13 }
    14 void quickCore(vector<int> &vi,int start,int end){
    15     if(start<end){
    16         int idx =partition(vi,start,end);
    17         quickCore(vi,start,idx-1);
    18         quickCore(vi,idx+1,end);
    19     }
    20 }
    21 
    22 void quickSort(vector<int>&vi){
    23     quickCore(vi,0,vi.size()-1);  
    24 }

    指定排序顺序快速排序

     1 bool cmp(const int &a,const int &b){
     2     return (b-a>=0)?true:false;
     3 }
     4 bool rcmp(const int &a,const int &b){
     5     return (b-a>=0)?false:true;
     6 }
     7 int partition(vector<int> &vi,int start,int end,bool (*cmp)(const int&,const int&)){
     8     int key=vi[start];
     9     while(start<end){
    10         while(start<end&&cmp(key,vi[end]))
    11             end--;
    12         vi[start]=vi[end];
    13         while(start<end&&!cmp(key,vi[start]))
    14             start++;
    15         vi[end]=vi[start];
    16     }
    17     vi[start]=key;
    18     return start;
    19 }
    20 void quickCore(vector<int> &vi,int start,int end,bool (*cmp)(const int&,const int&)){
    21     if(start<end){
    22         int idx =partition(vi,start,end,cmp);
    23         quickCore(vi,start,idx-1,cmp);
    24         quickCore(vi,idx+1,end,cmp);
    25     }
    26 }
    27 
    28 void quickSort(vector<int>&vi,bool (*cmp)(const int&,const int&)){
    29     quickCore(vi,0,vi.size()-1,cmp);  
    30 }

    指定任意对象和排序规则的快速排序

     1 struct component{
     2     int a;
     3     int b;
     4 };
     5 bool cmp(const component& obj1,const component& obj2){
     6     if(obj2.a>obj1.a)
     7         return true;
     8     else if(obj2.a<obj1.a)
     9         return false;
    10     else if(obj2.b>=obj1.b)
    11         return true;
    12     return false;
    13 }
    14 bool rcmp(const component& obj1,const component& obj2){
    15     if(obj1.a>obj2.a)
    16         return true;
    17     else if(obj1.a<obj2.a)
    18         return false;
    19     else if(obj1.b>=obj2.b)
    20         return true;
    21     return false;
    22 }
    23 
    24 template<class T>
    25 int partition(vector<T> &vi,size_t start,size_t end,bool (*cmp)(const T&,const T&)){
    26     T key=vi[start];
    27     while(start<end){
    28         while(start<end&&cmp(key,vi[end]))
    29             end--;
    30         vi[start]=vi[end];
    31         while(start<end&&!cmp(key,vi[start]))
    32             start++;
    33         vi[end]=vi[start];
    34     }
    35     vi[start]=key;
    36     return start;
    37 }
    38 template<class T>
    39 void quickCore(vector<T> &vi,size_t start,size_t end,bool (*cmp)(const T&,const T&)){
    40     if(start<end){
    41         size_t idx =partition(vi,start,end,cmp);
    42         quickCore(vi,start,idx-1,cmp);
    43         quickCore(vi,idx+1,end,cmp);
    44     }
    45 }
    46 template<class T>
    47 void quickSort(vector<T>&vi,bool (*cmp)(const T&,const T&)){
    48     quickCore(vi,0,vi.size()-1,cmp);  
    49 }

    迭代器类型快速排序

     1 struct component{
     2     int a;
     3     int b;
     4 };
     5 bool cmp(const component& obj1,const component& obj2){
     6     if(obj2.a>obj1.a)
     7         return true;
     8     else if(obj2.a<obj1.a)
     9         return false;
    10     else if(obj2.b>=obj1.b)
    11         return true;
    12     return false;
    13 }
    14 bool rcmp(const component& obj1,const component& obj2){
    15     if(obj1.a>obj2.a)
    16         return true;
    17     else if(obj1.a<obj2.a)
    18         return false;
    19     else if(obj1.b>=obj2.b)
    20         return true;
    21     return false;
    22 }
    23 bool cmp1(const int &a,const int &b){
    24     return (b-a>=0)?true:false;
    25 }
    26 bool rcmp1(const int &a,const int &b){
    27     return (b-a>=0)?false:true;
    28 }
    29 template<class Iterator, class Comparator>
    30 Iterator partition(Iterator start,Iterator end,Comparator cmp){
    31     typedef typename iterator_traits<Iterator>::value_type value_type;
    32     value_type key=*start;
    33     while(start!=end-1){
    34         while(start!=end-1&&cmp(key,*(end-1)))
    35             end--;
    36         *start=*(end-1);
    37         while(start!=end-1&&!cmp(key,*start))
    38             start++;
    39         *(end-1)=*start;
    40     }
    41     *(end-1)=key;
    42     return end-1;
    43 }
    44 template<class Iterator, class Comparator>
    45 void quickCore(Iterator start,Iterator end,Comparator cmp){
    46     if(start !=end){
    47         Iterator idx =::partition(start,end,cmp);
    48         quickCore(start,idx,cmp);
    49         quickCore(idx+1,end,cmp);
    50     }
    51 }
    52 template<class Iterator, class Comparator>
    53 void quickSort(Iterator start,Iterator end,Comparator cmp){
    54     quickCore(start,end,cmp);  
    55 }
    56 template<class Iterator>
    57 void quickSort(Iterator start,Iterator end){
    58     quickCore(start,end,less<typename iterator_traits<Iterator>::value_type>());  
    59 }

    测试

     1 #include <iostream>
     2 #include<vector>
     3 #include<algorithm>
     4 #include<set>
     5 using namespace std;
     6 
     7 int main( )
     8 { 
     9     vector<int> vi{1,7,3,1};
    10     quickSort(vi.begin(),vi.end());
    11     sort(vi.begin(),vi.end(),cmp1);
    12     for(int i=0;i<vi.size();i++)
    13         cout<<vi[i]<<"  ";
    14     cout<<endl;
    15     
    16     vector<component> obj{
    17       {1,4},
    18       {3,6},
    19       {2,8},
    20       {2,7},
    21       {1,1}
    22     };
    23     quickSort(obj.begin(),obj.end(),cmp);
    24     for(int i=0;i<obj.size();i++){
    25         cout<<obj[i].a<<"  "<<obj[i].b<<endl;
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    JS日期比较,使用正则表达式转换
    Using SQL*Loader to create an external table
    USACO试题beads的两种解法
    activiti5学习资料(5.12版本流程图的生成)
    黑马程序员_day20_Map集合
    开发者使用JasperReport——不同数据源之Map数据源
    给自己科谱:控制字符
    507 Jill Rides Again
    探讨工作流能给公司带来的几点益处
    ubuntu linux安装双系统的方法Win7、XP下均可
  • 原文地址:https://www.cnblogs.com/liferecord/p/4823962.html
Copyright © 2020-2023  润新知