排序算法小结

来源:互联网 发布:美工学习 编辑:程序博客网 时间:2024/06/16 05:33

各种排序

一.稳定排序
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;            }               }}
原创粉丝点击