算法模板:快速排序,欧拉筛法
-
快速排序:
-
原理:找到一个基准数,小于它的放一边,大于它的在另一边
-
应用:排序,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); }
-
-
欧拉筛法(线性筛):
-
原理:最小质因数*最大因数(非自身) = 合数,如此每个数仅被删除一次(
没明白,背模板就完事了) -
模板:
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; } }
-