总述:
排序,初赛知识点之一,都敲了一遍,供初赛复习。
此处收录了10 9种常见排序算法。只给出部分程序代码,读入一律使用Rd函数,输出为Pf。
计数排序。稳定,复杂度 O(n+m)
Rd(n); while(n--){ Rd(x); cnt[x]++; } for(int i=1;i<=10;i++) for(int j=1;j<=cnt[i];j++) Pf(i);
选择排序。不稳定,复杂度 O(n2)
Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); for(int i=1;i<=n;i++){ int t=i; for(int j=i+1;j<=n;j++) if(A[j]<A[t])t=j; swap(A[i],A[t]); } for(int i=1;i<=n;i++) Pf(A[i]);
冒泡排序。稳定,复杂度 O(n2) (实际为逆序对数)
Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); for(int i=1;i<=n;i++){ bool flag=false; for(int j=n;j>i;j--) if(A[j-1]>A[j])swap(A[j-1],A[j]),flag=true; if(!flag)break; } for(int i=1;i<=n;i++) Pf(A[i]);
插入排序。稳定,复杂度 O(n2)
Rd(n); A[0]=-INF; for(int i=1;i<=n;i++){ Rd(x); for(int j=i-1;j>=0;j--){ if(A[j]>x)A[j+1]=A[j]; else{A[j+1]=x;break;} } } for(int i=1;i<=n;i++) Pf(A[i]);
基数排序。稳定,复杂度 O(n∗m)
int d=1; Rd(n); for(int i=1;i<=n;i++)Rd(A[i]),A[i]+=Max; for(int i=0;i<=9;i++){ for(int j=0;j<=9;j++)s[j][0]=0; for(int j=1;j<=n;j++){ int k=A[j]/d%10; s[k][++s[k][0]]=A[j]; } int m=0; for(int j=0;j<=9;j++) for(int k=1;k<=s[j][0];k++) A[++m]=s[j][k]; d*=10; } for(int i=1;i<=n;i++)Pf(A[i]-Max);
归并排序。稳定,复杂度 O(nlogn)
void Merge(int L,int R){ if(L==R)return; int mid=(L+R)>>1; Merge(L,mid); Merge(mid+1,R); int i=L,j=mid+1,t=L; while(i<=mid&&j<=R){ if(A[i]<A[j])T[t++]=A[i++]; else T[t++]=A[j++]; } while(i<=mid)T[t++]=A[i++]; while(j<=R)T[t++]=A[j++]; for(int i=L;i<=R;i++)A[i]=T[i]; } int main(){ int n; Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); Merge(1,n); for(int i=1;i<=n;i++)Pf(A[i]); return 0; }
快速排序。不稳定,复杂度 O(nlogn)
void Qsort(int L,int R){ if(L>=R)return; int t=rand()%(R-L+1)+L; swap(A[L],A[t]); int tmp=A[L]; int l=L,r=R; while(l<r){ while(l<r&&A[r]>=tmp)r--; if(l<r)A[l]=A[r]; while(l<r&&A[l]<=tmp)l++; if(l<r)A[r]=A[l]; } A[l]=tmp; Qsort(L,l-1); Qsort(l+1,R); } int main(){ srand(time(NULL)); int n; Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); Qsort(1,n); for(int i=1;i<=n;i++)Pf(A[i]); return 0; }
希尔排序。不稳定,复杂度 O(n1.5)
Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); for(int step=n/2;step>=1;step/=2) for(int i=step;i<=n;i++) if(A[i-step]>A[i]){ int t=i-step,tmp=A[i]; while(t>=1&&A[t]>tmp){ A[t+step]=A[t]; t-=step; } A[t+step]=tmp; } for(int i=1;i<=n;i++)Pf(A[i]);
堆排序。不稳定,复杂度 O(nlogn)
void Up(int x){ while((x>>1)>=1&&A[x>>1]>A[x]){ swap(A[x>>1],A[x]); x>>=1; } } void Down(int x){ while((x<<1)<=tot){ int t=x<<1|1; if(t>tot)t=x<<1; if(A[x<<1]<A[t])t=(x<<1); if(A[t]<A[x])swap(A[x],A[t]),x=t; else break; } } int main(){ int n,x; Rd(n); for(int i=1;i<=n;i++){ Rd(x); A[++tot]=x; Up(tot); } for(int i=1;i<=n;i++){ Pf(A[1]); swap(A[1],A[tot--]); Down(1); } return 0; }
Sort(C++STL)。(
自带光环)速度奇快。Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); sort(A+1,A+n+1); for(int i=1;i<=n;i++)Pf(A[i]);