各种排序
一.稳定排序
1.记数排序
2.基数排序
3.插入排序
4.冒泡排序
5.归并排序
二.不稳定排序
1.选择排序
2.快速排序
3.堆排序
4.希尔排序
计数排序
int cnt[105],A[105],B[105];
void sort(int n){
FOR(i,1,n){
int x;
scanf("%d",&A[i]);
cnt[A[i]]++;
}
FOR(i,1,100){
cnt[i]+=cnt[i-1];
}
FOR(i,1,n){
B[cnt[A[i]]]=A[i];
cnt[A[i]]--;
}//B为排好序后的数组
}
基数排序
const int P=(1<<16)-1;
const int N=1<<16;
int A[100005];
int B[100005];
int cnt[N+5];
void sort(int n){
memset(cnt,0,sizeof(cnt));
FOR(i,1,n)cnt[A[i]&P]++;
FOR(i,1,N)cnt[i]+=cnt[i-1];
DOR(i,n,1)B[cnt[A[i]&P]--]=A[i];
memset(cnt,0,sizeof(cnt));
FOR(i,1,n)cnt[(B[i]>>16)&P]++;
FOR(i,1,N)cnt[i]+=cnt[i-1];
DOR(i,n,1)A[cnt[(B[i]>>16)&P]--]=B[i];
}
插入排序
int A[10005];
int B[10005];
void sort(int n){
FOR(i,1,n){
int j;
for(j=i-1;j>0;j--){
if(B[j]<=A[i])break;
B[j+1]=B[j];
}
B[j+1]=A[i];
}
}
冒泡排序
int A[10005];
void sort(int n){
FOR(i,1,n){
FOR(j,1,n-i){
if(A[j]>A[j+1])swap(A[j],A[j+1]);
}
}
}
归并排序
int A[10005],tmp[10005];
void sort(int l,int r){
if(l>=r)return;
int mid=(l+r)>>1;
sort(l,mid);
sort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(A[i]>A[j])tmp[k++]=A[j],j++;
else tmp[k++]=A[i],i++;
}
while(i<=mid)tmp[k++]=A[i],i++;
while(j<=r)tmp[k++]=A[j],j++;
FOR(i,l,r)A[i]=tmp[i];
}
选择排序
int A[10005];
void sort(int n){
FOR(i,1,n){
int k=i;
FOR(j,i+1,n){
if(A[j]<A[k])k=j;
}
if(k!=i)swap(A[i],A[k]);
}
}
快速排序
int A[10005];
void sort(int l,int r){
int i=l,j=r,key=A[l];
while(i<j){
while(i<j&&A[j]>=key)j--;
if(i<j)A[i]=A[j];
while(i<j&&A[i]<=key)i++;
if(i<j)A[j]=A[i];
}
A[i]=key;
if(l<i-1)sort(l,i-1);
if(i+1<r)sort(i+1,r);
}
堆排序
int n;
int A[10005];
void down(int p){
while(2 *p<=n){
int t=2*p;
if(t+1<=n&&A[t+1]<A[t])t++;
if(A[p]<A[t])break;
swap(A[p],A[t]);
p=t;
}
}
int top(){return A[1];}
void pop(){
A[1]=A[n--];
down(1);
}
void sort(int n){
DOR(i,n/2,1)down(i);
int m=n;
FOR(i,1,m){printf("%d ",top());pop();}
}
希尔排序
void sort(int n){
int gap,i,j,temp;
for (gap=n/2;gap>0;gap/=2){
for(i=gap;i<=n;i++)
for(j=i-gap;j>=1&&A[j]>A[j+gap];j-=gap){
temp = A[j];
A[j] = A[j+gap];
A[j+gap] = temp;
}
}
}