• 排序


    排序法 平均时间 最差情形 稳定度 额外空间
    冒泡 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 }
  • 相关阅读:
    [转][html5]网页横屏
    [转][EasyUI]扩展 DateBox
    [转][C#]枚举的遍历Enum
    [转][C#]单例模式之懒加载
    [C#][Quartz]添加监听器
    [C#][Quartz]帮助类
    [转]Win 10 的 Win 按键没反应
    转来的--轻松自动化---selenium-webdriver(python) (七)---定位iframe——转来的
    安装charles
    遇到的问题汇总
  • 原文地址:https://www.cnblogs.com/gongxijun/p/4813489.html
Copyright © 2020-2023  润新知