zoukankan      html  css  js  c++  java
  • 排序

    排序法 平均时间 最差情形 稳定度 额外空间
    冒泡 O(n2)     O(n2) 稳定 O(1)
    交换     O(n2)     O(n2) 不稳定 O(1)
    选择 O(n2) O(n2) 不稳定 O(1)
    插入 O(n2) O(n2) 稳定 O(1)
    基数 O(logRB) O(logRB) 稳定 O(n)
    Shell O(nlogn) O(ns) 1<s<2 不稳定 O(1)
    快速 O(nlogn) O(n2) 不稳定 O(nlogn)
    归并 O(nlogn) O(nlogn) 稳定 O(1)
    O(nlogn) O(nlogn) 不稳定

    O(1)

    插入排序:

       

     1 #include<stdio.h>
     2 //╡ЕхКеепР
     3 template<class T1 ,class T2>
     4 void Isort(T1 *arg , T2 len){
     5 
     6      T2 i,j;
     7    for(i=1; i<len ; i++){
     8       int val = arg[i];
     9       for( j= i-1 ; j>=0&&val<arg[j]; j--)
    10              arg[j+1]=arg[j];
    11        arg[j+1]=val;
    12    }
    13 }
    14 /*
    15 template<class T1 ,class T2 ,size_t size>
    16 void Isort(T1 (&arg)[size] , T2 len){
    17 
    18      T2 i,j;
    19    for(i=1; i<len ; i++){
    20       int val = arg[i];
    21       for( j= i-1 ; j>=0&&val<arg[j]; j--)
    22              arg[j+1]=arg[j];
    23        arg[j+1]=val;
    24    }
    25 }
    26 */

    冒泡排序:

      

     1 void mPaoSort(int *arg , int len){
     2    int i,j;
     3    bool tag;
     4    for(i=0;i<len ;i++){
     5      for(j=i+1 , tag= false ;j<len ;j++){
     6         if(arg[i]>arg[j]){
     7             arg[i]^=arg[j];
     8             arg[j]^=arg[i];
     9             arg[i]^=arg[j];
    10             tag=true;
    11         }
    12      }
    13      if(!tag) break;
    14    }
    15 }

    归并排序:

    void Merge(int *A ,int ps ,int mid , int len){
          int i=ps,j=mid,cnt=0;
          int C[len-ps+1];
          while(i<mid&&j<len ){
           if(A[i]>A[j]) C[cnt++]=A[j++];
           else C[cnt++]=A[i++];
          }
          while(i<mid) C[cnt++]=A[i++];
          while(j<len) C[cnt++]=A[j++];
          for(i=ps; i<len ;i++)
                A[i]=C[i-ps];
    }
    
    
    
    //递归版
    void Msort(int *arg ,int ps, int len){
    
        if(ps+1<len) {
        int mid = ps+((len-ps)>>1L);
        Msort(arg ,ps ,mid);
        Msort(arg, mid,len);
        Merge(arg ,ps,mid, len);
    }
    }
    //非递归版
    void Msort_(int *arg , int ps , int len){
    
         int s,t=1;
         while(ps+t<=len){
             s=t;
             t=2*s;
             int pos=ps;
           while(pos+t<=len){
             Merge(arg,pos,pos+s,pos+t);
             pos+=t;  //移动
           }
           if(pos+s<len)
               Merge(arg,pos,pos+s,len);
         }
         if(ps+s<len)
           Merge(arg,ps,ps+s,len);
    
    }

    计数排序:

      

    1 //╪фйЩеепР
    2 void JSort(int *arg , int len){
    3     int ans[10]={0} ,i,j=0;
    4     for(i=0; i<len ;i++)
    5         ans[arg[i]]++;
    6     for(j=i=0;i<10 ;i++)
    7       while(ans[i]--)
    8          arg[j++]=i;
    9 }

    桶排序:

    //桶排序
    #include<iostream>
    #include<string.h>
    
    typedef struct node{
    
       int val ;
       struct node * next;
       void init(){
          val=0;
          next=NULL;
       }
    }Node;
    
    void BSort(int *arg , int len , int blen ){
    
        int i;
        Node* Barry = (Node *)malloc(blen*sizeof(Node));  //定义一个二维数组
        for( i=0;i<blen ;i++)
            Barry[i].init();
            Node *head =NULL;
        for( i=0;i<len ;i++){
          Node *p = (Node *)malloc(sizeof(Node));
            p->val=arg[i];
            p->next=NULL;
            int sp = arg[i]/10;
            head =&Barry[sp];
            if(!head->val){
                //为空,就直接将其加载到后面即可
                head->next = p;
                head->val=head->val+1;  //统计个数
            }else{
             //如果不相等,选择插入排序
               Node *tm=head->next ,*cur =head;
               while(tm!=NULL&&tm->val<arg[i]){
                     cur =tm;
                     tm=tm->next;
               }
               cur->next=p ;
               p->next = tm;
               head->val=head->val+1;
            }
        }
        for(int i=0; i<blen ;i++){
            Node *p;
            if(Barry[i].val){
              p = Barry[i].next;
             while(p){
                printf("%d ",p->val);
                p=p->next;
             }
             puts("");
            }
        }
    }
    
    int main1(int argc , char* argv[] ){
       int ss[]={3,4,5,61,12,8,9,20,22,45,87};
    
       BSort(ss ,sizeof(ss)/sizeof(int), 10);
       return 0;
    }

    选择排序:

     1 //选择排序
     2 void  Ssort(int *arg ,int len){
     3   for(int i=0;i<len ;i++){
     4      int mx=i;
     5     for(int j=i+1; j<len ;j++){
     6         if(arg[mx]<arg[j])mx=j;
     7     }
     8      if(i!=mx){
     9         arg[mx]^=arg[i];
    10         arg[i]^=arg[mx];
    11         arg[mx]^=arg[i];
    12      }
    13   }
    14 }

    快速排序:

     1 //快速排序
     2 void qsort(int *arg ,int ps ,int len){
     3 
     4   int i,j,val=arg[ps];
     5   if(ps<len){
     6     i=ps,j=len;
     7     while(i!=j){
     8       while(i<j&&arg[j]>=val) j--;
     9       if(i<j) arg[i] = arg[j];
    10       while(i<j&&arg[i]<=val) i++;
    11       if(i<j)arg[j]=arg[i];
    12     }
    13   arg[i]=val;
    14   qsort(arg,ps ,i-1);
    15   qsort(arg,i+1,len);
    16  }
    17 }

    堆排序:

     1 //堆排序
     2 void MaxHeap(int *arg ,int ps ,int len){
     3    //构建一个堆
     4  int cl = 2*ps , cr = 2*ps+1;
     5 
     6  if(ps<=len/2){
     7    int mx = ps;  //父节点
     8    if(cl<len&&arg[mx]<arg[cl])   mx = cl;
     9    if(cr<len&&arg[mx]<arg[cr])   mx = cr;
    10    if(mx!=ps){
    11       arg[mx]^=arg[ps];
    12       arg[ps]^=arg[mx];
    13       arg[mx]^=arg[ps];
    14       MaxHeap(arg,mx,len);  //数据有改动,需要重新对改动的地方进行维护
    15    }
    16   }
    17 }
    18 
    19 //建立新堆
    20 void Build(int *arg , int len){
    21    for(int i=len/2 ; i>=1 ; i--){
    22         MaxHeap(arg,i,len);
    23    }
    24 }
    25 
    26 //堆排序Hsort
    27 void Hsort(int *arg , int len){
    28        Build(arg,len);  //初始化
    29       // (o(n))
    30        for(int i=len ; i>1 ; i--){
    31         arg[1]^=arg[i];
    32         arg[i]^=arg[1];
    33         arg[1]^=arg[i];
    34         MaxHeap(arg,1,i);
    35      }
    36 }

    基数排序:

     1 //基数排序
     2 typedef struct bas{
     3    int val;
     4    struct bas *next;
     5    void init(){
     6      val=0;
     7      next=NULL;
     8   }
     9 }Bas;
    10 void Basort(int *arg  ,int len){
    11   //对于数字在0-9
    12     Bas *Barr[10];  //0-9
    13     for(int i=0;i<10 ; i++){
    14       Barr[i] = (Bas *)malloc(sizeof(Bas));
    15       Barr[i]->init();
    16     }
    17   bool tag=false;
    18   int mod =1;
    19    while(1){
    20     tag=false;
    21         for(int i=0;i<10 ; i++)
    22             Barr[i]->init();
    23      for(int i=0;i<len ; i++){
    24         Bas *p  = (Bas *)malloc(sizeof(Bas));
    25         p->val=arg[i];
    26         p->next=NULL;
    27         int hig =arg[i]/mod;
    28         int dex = hig%10;
    29         if(hig) tag=true;  //只要有一位不为0,就继续
    30         Bas *pb=Barr[dex];
    31         while(pb->next)
    32             pb = pb->next;
    33            pb->next = p;
    34     }
    35     //将值全部放置到arg中
    36     int cnt=0;
    37     for(int i=0;i<10 ; i++){
    38          Bas *pb = Barr[i]->next,*tm;
    39          while(pb){
    40             arg[cnt++]=pb->val;
    41             tm=pb;
    42             pb=pb->next;
    43             free(tm);
    44          }
    45     }
    46     if(!tag) return ;
    47     mod*=10;
    48   }
    49 }
    50 
    51 int  main(){
    52  int sss[]={100,123,45,67,123,1,4,5,10};
    53  Basort(sss,sizeof(sss)/sizeof(int));
    54  print(sss,sizeof(sss)/sizeof(int));
    55  return 0;
    56 }
  • 相关阅读:
    【杂谈】需要mark的一些东西
    【codeforces】940F题解
    【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
    【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1
    【FCS NOI2018】福建省冬摸鱼笔记 day5
    【FCS NOI2018】福建省冬摸鱼笔记 day4
    【FCS NOI2018】福建省冬摸鱼笔记 day3
    【FCS NOI2018】福建省冬摸鱼笔记 day2
    【FCS NOI2018】福建省冬摸鱼笔记 day1
    【6】装饰器、闭包、偏函数、变量作用域问题
  • 原文地址:https://www.cnblogs.com/gongxijun/p/4813489.html
Copyright © 2011-2022 走看看