算法模板:快速排序,欧拉筛法

  1. 快速排序:

    • 原理:找到一个基准数,小于它的放一边,大于它的在另一边

    • 应用:排序,STL sort

    • 模板:

      void quicksort(int l,int r) { //取左一为基准轴
          int i=l,j=r;
          int k=a[l];
          if(i>=j) return;
          while(i<j) {
              while(i<j && a[j]>k) j--;
             	if(i<j) {a[i]=a[j]; i++}
              while(i<j && a[i]<=k) i++;
              if(i<j) {a[j]=a[i]; j--} 
          }
          a[i] = k;
          quicksort(l,i-1);
          quicksort(i+1,r);
      }
      

      优化:选取基准轴时采用三数取中法,分区规模够小时采用插排法,聚集相等元素,优化尾递归等...

      void qsort(int l,int r) {
          int mid=a[(l+r)/2];
          int i=l,j=r;
          while(i<j) {
      		while(a[i]<mid) i++;
              while(a[j]>mid) j--;
              if(i<=j) {
                  swap(a[i],a[j]);
                  i++;
                  j--;
              }
          }
          if(l<j) qsort(l,j);
          if(i<r) qsort(i,r);
      }
      
  2. 欧拉筛法(线性筛):

    • 原理:最小质因数*最大因数(非自身) = 合数,如此每个数仅被删除一次(没明白,背模板就完事了

    • 模板:

      cnt = 0;
      memset(isPrime,1,sizeof(isPrime));
       isPrime[1] = 0;
      for(int i=2; i<=n; i++) {
      	if(isPrime[i]) 
              Prime[++cnt] = i;
          for(int j=1; j<=cnt && i*Prime[j]<=n; j++) {
              isPrime[i*Prime[j]] = 0;
              if(i%Prime[j] == 0) break;
          }
      }
      
posted @ 2020-09-21 20:47  随意随缘  阅读(319)  评论(0编辑  收藏  举报
有事您Q我