当前位置:   article > 正文

基础算法模板

基础算法模板

〇    快速排序
 

  1. void quick_sort( int q[] , int l , int r)
  2. {
  3.     if(l > r)    return;                        
  4.     int    x = q[ l + r >> 1 ];                 
  5.     int    i = l - 1 , j = r + 1;                 
  6.     while(i < j)                            
  7.     {
  8.         do    i++;while(q[i] < x);            
  9.         do    j--;while(q[j] > x);            
  10.         if(i < j)    swap( q[i] , q[j] );    
  11.     }
  12.     quick_sort( q , l , j );                
  13.     quick_sort( q , j + 1 , r );
  14. }

〇    归并排序

  1. void  merge_sort( int q[] , int l , int r)
  2. {
  3.     if(l > r)    return;                                            
  4.     int    mid = l + r >> 1;                                        
  5.     merge_sort( q , l , mid ),merge_sort( q , mid + 1 , r);          
  6.     int    k = 0;                                                  
  7.     int i = l , j = mid + 1;                                        
  8.     while(i <= mid && j <= r)                                    
  9.     if(q[i] <= q[j])    tmp[k++] = q[i++];                        
  10.     else    tmp[k++] = q[j++];
  11.     while(i <= mid)    tmp[k++] = q[i++];                            
  12.     while(j <= r)    tmp[k++] = q[j++];
  13.     
  14.     for(i = l,k = 0 ; i <= r ; i++,k++)                            
  15.         tmp[k] = q[i]
  16. }


〇 二分
 

  1. int    bsearch_l(int l,int r)
  2. {
  3.     while(l < r)                        
  4.     {
  5.         int    mid = l + r >> 1;            
  6.         if(check(mid))    r = mid;        
  7.         else    l = mid + 1;            
  8.     }
  9.     return    l;                           
  10. }
  11. int    bsearch_r(int l,int r)
  12. {
  13.     while(l < r)
  14.     {
  15.         int    mid = l + r + 1 >> 1;
  16.         if(check(mid))    l = mid;        
  17.         else    r = mid - 1;            
  18.     }
  19.     return    l;
  20. }

〇    高精度加法
 

  1. vector<int>    add(vector<int> &A , vector<int> &B)
  2. {
  3.     vector<int>    C;                                    
  4.     int    t = 0;                                        
  5.     for(int i = 0;i < A.size() || i < B.size();i++)     
  6.     {
  7.         if(i < A.size())    t += A[i];                  
  8.         if(i < B.size())    t += B[i];                  
  9.         C.push_back(t % 10);                         
  10.         t /= 10;                                    
  11.     }
  12.     if(t)    C.push_back(1);                            
  13.     return    C;                                        
  14. }

〇    高精度减法
 

  1. vector<int>    sub(vector<int> &A , vector<int> &B)               
  2. {
  3.     vector<int>    C;                                            
  4.     for(int i = 0,t = 0;i < A.size();i++)                      
  5.     {                                                       
  6.         t = A[i] - t;                                        
  7.         if(i < B.size())    t -= B[i];                         
  8.         C.push_back((t + 10) % 10);                            
  9.         if(t < 0)    t = 1;                                    
  10.         else    t = 0;                                        
  11.     }
  12.     while(C.size() > 1 && C.back() == 0)    C.pop_back();       
  13.     return    C;                                                
  14. }

〇    高精度乘法
 

  1. vector<int>    mul(vector<int> &A , int B)
  2. {
  3.     vector<int>    C;                                
  4.     int    t = 0;                                    
  5.     for(int i = 0;i < A.size() || t;i++)           
  6.     {
  7.         if(i < A.size())    t += A[i] * B;          
  8.         C.push_back(t % 10);                    
  9.         t /= 10;                                
  10.     }
  11.     return    C;                                    
  12. }

〇    高精度除法
 

  1. vector<int>    div(vector<int> &A , int B , int &r )      
  2. {
  3.     vector<int>    C;                                    
  4.     r = 0;                                          
  5.     for(int    i = A.size() - 1;i >= 0;i--)              
  6.     {
  7.         r = r * 10 + A[i];                            
  8.         C.push_back(r / b);                            
  9.         r % b;                                      
  10.     }
  11.     reverse(C.begin() , C.end());                    
  12.     while(C.size() > 1  && C.back() == 0)    C.pop_back();        
  13.     return    C;                                    
  14. }

〇    一维前缀和
 

  1. for(int  i = 1;i <= n;i++)
  2.     s[i] = s[i - 1] + a[i];
  3.     
  4.     //可用于快速计算数组a中某区间的和
  5.     //要计算 a[l] 到 a[r] 的和
  6.     //即计算 s[r] - s[l - 1];

〇    二维前缀和
 

  1. for(int i = 1;i <= n;i++)
  2.     for(int j = 1;j <= m,j++)
  3.         s[i][j] = s[i - 1][j] + s[i][j -1] + a[i][j] + a[i - 1][j - 1];
  4.         //可用于快速求矩阵中以 ( x1 , y1 ) , ( x2 , y2 )为对角线的矩形区域的和
  5.         //和即 s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];

〇    一维差分
 

  1. void    insert(int l,int r,int c)
  2. {
  3.     b[l] += c;
  4.     b[r + 1] -= c; 
  5. }
  6. ... ...
  7. for(int i = 1;i <= n;i++)    insert( i , i , a[i]);
  8.     //可快速完成将 [ l , r ] 区间的元素均加上 c 的操作
  9.     //执行 insert 函数即可
  10.     //对 数组b 做前缀和,即可得到 数组a

〇    二维差分
 

  1. void    insert(int x1,int y1,int x2,int y2,int c)
  2. {
  3.     b[x1][y1] += c;
  4.     b[x2 + 1][y1] -= c;
  5.     b[x1][y2 + 1] -= c;
  6.     b[x2 + 1][y2 + 1] += c;
  7. }
  8. ... ...
  9. for(int i = 1;i <=n ;i++)
  10.     for(int j = 1;j <= n;j++)
  11.         insert( i , j , i , j , a[i][j]);

〇    离散化

  1. vector<int>    alls;
  2. sort(alls.begin() , alls.end());
  3. alls.erase(unique(alls.begin() , alls.end()) , alls.end());
  4. int    find(int x)
  5. {
  6.     int    l = 0,r = alls.size() - 1;
  7.     while(l < r)
  8.     {
  9.         int    mid = l + r >> 1;
  10.         while(l < r)
  11.         {
  12.             if(alls[mid] >= x)    r = mid;
  13.             else    l = mid + 1;
  14.         }
  15.     }
  16.     return    r + 1;
  17. }

〇    区间合并
 

  1. typedef    pair<int,int>    PII;
  2. vector<PII>    segs;
  3. void    merge(vector<PII> &segs)
  4. {
  5.     vector<PII> res;
  6.     sort(segs.begin() , segs.end());
  7.     int    st = -2e9 , ed = -2e9;
  8.     for(auto seg:segs)
  9.     if(ed < seg.first)
  10.     {
  11.         if(st != -2e9)    res.push_back({st,ed});
  12.         st = seg.first,ed = seg.second;
  13.     }
  14.     else    ed = max(ed , seg.second);
  15.     if(st != -2e9)    res.push_back({st,ed})
  16.     segs = res;
  17. }

欢迎订阅专栏,数据结构实验,期末大作业,前端后端,算法都有哦,想我发哪个方面的资源或文章可以私信我,免费的哦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/963295
推荐阅读
相关标签
  

闽ICP备14008679号