排序

来源:互联网 发布:淘宝发布品牌不能为空 编辑:程序博客网 时间:2024/05/02 18:31

1、分治法排序

#include<iostream>using namespace std;const int len=5;void Merge_s(int *A,int p,int q,int r){    int n1=q-p+1;    int n2=r-q;    int i=0,j=0,k=0;    int L[n1+1],R[n2+1];    for(i=0;i<n1;i++)        L[i]=A[p+i];    for(j=0;j<n2;j++)        R[j]=A[q+1+j];    i=0;j=0;    for(k=0;k<n1+n2;k++)    {        if(i<n1&&j<n2)            if(L[i]<R[j])                A[k+p]=L[i++];            else                A[k+p]=R[j++];        else if(i>=n1)            A[k+p]=R[j++];        else            A[k+p]=L[i++];    }}void Merge_sort(int *A,int p,int r){    if (p<r)       {int q=(p+r)/2;//抹去小数部分,向下取整。        Merge_sort(A,p,q);        Merge_sort(A,q+1,r);        Merge_s(A,p,q,r);       }}int main(){    int A[len];    for(int i=0;i<len;i++)        cin>>A[i];    Merge_sort(A,0,4);    for(int i=0;i<len;i++)        cout<<A[i];}

2、冒泡排序

#include<iostream>using namespace std;const int len=5;//冒泡排序int main(){    int i=0,j=0,temp=0;    int A[len];    for(i=0;i<len;i++)    {        cin>>A[i];    }    for(i=len-1;i>=1;i--)        for(j=0;j<i;j++)    {        if(A[j]>A[j+1])        {            temp=A[j];            A[j]=A[j+1];            A[j+1]=temp;        }    }        for(i=0;i<len;i++)    {        cout<<A[i];    }}

3、插入排序

#include<iostream>using namespace std;const int len=5;int main(){    int A[len];    for(int i=0;i<len;i++)        cin>>A[i];    int i=0,j=0,key=0;    for(i=1;i<len;i++)    {        key=A[i];        j=i-1;        while(j>=0&&A[j]>key)        {            A[j+1]=A[j];            j--;        }        A[j+1]=key;    }        for(int i=0;i<len;i++)        cout<<A[i];}

4、希尔排序

#include<iostream>using namespace std;int const len=10;void shell(int *A,int d){    int i=0,j=0,k=0;    int key=0;    for(k=0;k<d;k++)    {        for(i=k+d;i<len;i+=d)        {            key=A[i];            j=i-d;            while(j>=k&&A[j]>key)            {                A[j+d]=A[j];                j-=d;            }            A[j+d]=key;        }    }}int main(){    int A[len];    for(int i=0;i<len;i++)        cin>>A[i];    for(int d=len/2;d>0;d/=2)    {        shell(A,d);    }    for(int i=0;i<len;i++)        cout<<A[i];}

5、快速排序

#include<iostream>using namespace std;int const len=10;int part(int *A,int p,int r){    int key=A[r];    int i=0,j=0,temp;    i=p-1;    j=p;    for(j=p;j<r;j++)    {        if (A[j]<key)        {            temp=A[j];            A[j]=A[i+1];            A[i+1]=temp;            i++;        }    }    A[r]=A[i+1];    A[i+1]=key;    return i+1;}void quick(int *A,int p,int r){    if (p<r)    {        int q=part(A,p,r);        quick(A,p,q-1);        quick(A,q+1,r);    }}int main(){    int A[len];    for(int i=0;i<len;i++)        cin>>A[i];    quick(A,0,len-1);    for(int i=0;i<len;i++)        cout<<A[i];}


6、堆排序

#include<iostream>using namespace std;int const len=10;inline int left(int i){    return 2*i+1;}inline int right(int i){    return 2*i+1+1;}void maxheapify(int *A,int i,int heapsize)//heapsize的用法{    int l=left(i),r=right(i);    int temp=0;    int largest=i;    if(l<heapsize&&A[l]>A[i])        largest=l;    else        largest=i;    if(r<heapsize&&A[r]>A[largest])        largest=r;    if(largest!=i)    {        temp=A[i];        A[i]=A[largest];        A[largest]=temp;        maxheapify(A,largest,heapsize);    }}void buildheap(int *A,int heapsize)//!{    for(int i=len/2-1;i>=0;i--)    {        maxheapify(A,i,heapsize);//!    }}int main(){    int A[len];    int heapsize=0,temp=0;    for (int i=0;i<len;i++)        cin>>A[i];    heapsize=len;    buildheap(A,heapsize);    for(int i=len-1;i>=1;i--)    {        temp=A[i];        A[i]=A[0];        A[0]=temp;        heapsize-=1;        maxheapify(A,0,heapsize);    }    for (int i=0;i<len;i++)//!问题,2*0=0,2*0—+1=1.而实际应该是1和2.        cout<<A[i];}

7、计数排序

#include<iostream>using namespace std;int const maxnum=20;//待排序的数组中,数字的范围为0-19int const len=10;//数组的长度int main(){    int A[len],B[len],C[maxnum]={0};    for(int i=0;i<len;i++)    {        cin>>A[i];        C[A[i]]++;    }    for(int i=1;i<maxnum;i++)    {        C[i]+=C[i-1];    }    for(int i=len-1;i>=0;i--)//非常重要,一定要倒序,不然就不稳定了    {        B[C[A[i]]-1]=A[i];        C[A[i]]-=1;    }    for(int i=0;i<len;i++)    {        cout<<B[i];    }}

8、基数排序(中间过程为计数排序)

#include<iostream>#include<math.h>using namespace std;int const d=3;//待排序数组中,数字的最高位数。int const maxnum=10;//每一位的范围为0——9。int const len=5;//共有5个数待排序int main(){    int A[len],B[len],C[maxnum]={0};    int n;    for(int i=0;i<len;i++)        cin>>A[i];    for(int i=0;i<d;i++)    {        for(int j=0;j<len;j++)        {            n=int(A[j]/pow(10,i))%10;            C[n]+=1;        }        for(int j=1;j<maxnum;j++)        {            C[j]+=C[j-1];        }        for(int j=len-1;j>=0;j--)        {            n=int(A[j]/pow(10,i))%10;            B[C[n]-1]=A[j];            C[n]-=1;        }        for(int j=0;j<len;j++)        {            A[j]=B[j];            B[j]=0;        }        for(int j=0;j<maxnum;j++)        {            C[j]=0;        }    }    for(int i=0;i<len;i++)        cout<<A[i]<<' ';}

9、桶排序

头文件:dll.h

#ifndef DLL_H_INCLUDED#define DLL_H_INCLUDEDclass dll{public:    dll *next;    dll *pre;    float data;};#endif // DLL_H_INCLUDED

主程序:

#include<iostream>#include "dll.h"using namespace std;int const len=10;//待排序的数有10个int const bnum=10;//设置10个桶int const range=100;//待排序的数字均匀分布在1——100之间。dll *create(float datai){    dll *head=new dll[1];    head->next=NULL;    head->pre=NULL;    head->data=datai;    return head;}void inst(dll *head,float datai){    dll *tail=new dll[1];    tail->next=NULL;    tail->pre=NULL;    tail->data=datai;    while(head->next!=NULL)        head=head->next;    head->next=tail;    tail->pre=head;}void sot(dll *head){    dll *p1,*p2,*nxt;    float key;    p1=head->next;    while(p1!=NULL)    {        key=p1->data;        nxt=p1;//每次的初始值不要忘记        p2=p1->pre;        while((p2!=NULL)&&(p2->data>key))        {            p2->next->data=p2->data;            nxt=p2;            p2=p2->pre;        }        nxt->data=key;        p1=p1->next;    }}dll *totail(dll *head){    while(head->next!=NULL)        head=head->next;    return head;}int main(){    float A[len];    float k=range/bnum;//每个桶的宽度    int j=0;    dll *B[bnum]={NULL};    dll *head,*tail,*p;    for(int i=0;i<len;i++)        cin>>A[i];    for(int i=0;i<len;i++)    {        j=A[i]/k;        if(B[j]==NULL)            B[j]=create(A[i]);        else            inst(B[j],A[i]);    }    for(int j=0;j<bnum;j++)    {        if(B[j]!=NULL)        {            sot(B[j]);            p=B[j];//输出每个桶中的排序结果            while(p!=NULL)            {                cout<<p->data<<' ';                p=p->next;            }            cout<<endl;        }    }    j=0;    while(B[j]==NULL)        j++;    head=B[j];    tail=totail(head);    p=head;    while(p!=NULL)            {                cout<<p->data<<' ';                p=p->next;            }            cout<<endl;    for(;j<bnum;j++)    {        if(B[j]!=NULL)        {            tail->next=B[j];            B[j]->pre=tail;            tail=totail(B[j]);            p=head;//查看每次连接的结果            while(p!=NULL)            {                cout<<p->data<<' ';                p=p->next;            }            cout<<endl;        }    }    for(int i=0;i<len;i++)    {        A[i]=head->data;        head=head->next;    }    for(int i=0;i<len;i++)        cout<<A[i]<<' ';}