排序算法彙總

void insertsort(int   a[],int   n)           //簡單插入排序  
{  
    int   i,j,k,t;  
    for(i=1;i<n;i++)  
    for(j=0;j<i;j++)  
    if(a[j]>a[i])  
     {  
            t=a[i];  
            for(k=i;k>j;k--)   a[k]=a[k-1];  
            a[j]=t;  
            break;  
    }  
}  
   
void InsertSort(int   a[],int   n)           //折半插入排序  
 {
    int i,j,temp,low,high,m;  
    for(i=1;i<n;i++)  
    {  
        temp=a[i];  
        low=0;high=i-1;  
        while(low<=high)  
        {  
            m=(low+high)/2;  
            if(temp<a[m])   high=m-1;  
            else   low=m+1;  
        }  
        for(j=i-1;j>=low;j--)   a[j+1]=a[j];  
        a[low]=temp;  
      }  
}  
   
typedef struct{     //表插入排序(不需要移動元素   )  
    int a;  
    int next;               //指針,指向比a大一點的數  
}slnode;  
   
void    arrange(slnode r[],int n)  
 {  
    int i,p,q;  
    slnode t;  
    p=r[0].next;  
    for(i=1;i<n;i++)  
    {  
        while(p<i)   p=r[p].next;  
        q=r[p].next;                   //必須有  
        if(p!=i)  
          {  
            t=r[p];r[p]=r[i];r[i]=t;  
            r[i].next=p;  
          }  
        p=q;  
    }  
}  
void listinsertsort(int aa[],int n)       //表插入排序(不需要移動元素   )  
{  
    int i;  
    int j,j0;  
    const   int maxint=20000;  
    slnode   r[n+1];  
    r[0].a=maxint;r[0].next=1;  
    r[1].next=0;  
    for(i=0;i<10;i++)  
        r[i+1].a=aa[i];  
    for(i=2;i<11;i++)  
    {  
        j=r[0].next;  
        j0=0;  
        while(r[i].a>r[j].a)   {j0=j;j=r[j].next;}  
        r[j0].next=i;  
        r[i].next=j;  
 }  
        arrange(r,n+1);  
        for(i=0;i<10;i++)  
            aa[i]=r[i+1].a;  
}  
  void shellinsert(int a[],int n,int m)  
 {  
  //功能:以m爲增量對a進行插入排序  
    int   i,j,t;  
    for(i=m;i<n;i++)  
        if(a[i]<a[i-m])  
        {  
            t=a[i];  
            for(j=i-m;j>=0&&t<a[j];j-=m)  
                a[j+m]=a[j];  
            a[j+m]=t;  
          }  
}  
   
void shellsort(int a[],int n)               //shell排序(屬於高效排序)  
{  
    int   k=n;  
    k=(5*k-1)/11;                                   //取序列是a(n)=(5n-1)/11  
    while(k>=2)  
    {  
        shellinsert(a,n,k);  
        k=(5*k-1)/11;  
    }  
    shellinsert(a,n,1);  
}  
   
   
  //起泡排序用的很少,此處省略  
void quicksort1(int a[],int m,int n)     //快速排序(最簡單的高效排序)  
{  
    int i,j;  
    int temp;  
    if(m>=n)
        return;  
    i=m;  
    j=n;  
    temp=a[i];                               //以a[m]爲樞軸  
    while(i<j)  
    {  
        while(temp<=a[j]&&i<j)  
            j--;  
        a[i]=a[j];  
        while(temp>=a[i]&&i<j)  
            i++;  
        a[j]=a[i];  
    }  
    a[i]=temp;  
    quicksort1(a,m,i-1);  
    quicksort1(a,i+1,n);  
}
void quicksort2(int a[],int m,int n)   //快速排序(最簡單的高效排序)  
{  
    int i,j,mid=(m+n)/2;  
    int temp;  
    if(m>=n)
        return;  
    i=m;     j=n;  
    temp=a[mid];  
    while(temp>=a[i]&&i<mid)  
        i++;  
    if(i<mid)
        a[mid]=a[i];         //以a[mid]爲樞軸(也可以選取a[m],a[mid],  
                                                                    //a[n]中的中值,可以改進快速在最壞情況下的性能)  
    while(i<j)  
    {  
        while(temp<=a[j]&&i<j)  
            j--;  
        a[i]=a[j];  
        while(temp>=a[i]&&i<j)  
            i++;  
        a[j]=a[i];  
    }  
    a[i]=temp;  
    quicksort2(a,m,i-1);  
    quicksort2(a,i+1,n);  
   }  
   
void   merge(int   a[],int   b[],int   i,int   m,int   n)  
{  
  //函數功能:將有序列a[i,...,m]和a[m+1,....,n]歸併爲有序列b[i,...,n]  
    int   j,k,t;  
    for(j=m+1,k=i;i<=m&&j<=n;k++)  
    {  
        if(a[i]>a[j])     b[k]=a[j++];  
        else     b[k]=a[i++];  
    }  
        if(i<=m)  
            for(t=0;t<=m-i+1;t++)  
                b[k+t]=a[i+t];  
        if(j<=n)  
            for(t=0;t<=n-j+1;t++)  
                b[k+t]=a[j+t];  
 }  
   
void msort(int a[],int b[],int s,int t)           //2路   並歸排序(用的不多)  
 {  
    int   m,c[t-s+1];  
    if(s==t)
        b[s]=a[s];  
    else  
      {  
            m=(s+t)/2;  
            msort(a,c,s,m);  
            msort(a,c,m+1,t);  
            merge(c,b,s,m,t);  
      }  
 }  
   
void selectsort(int a[],int n)  
{                                                               //簡單選擇排序...  
    int i,j,k,t;  
    for(i=0;i<n;i++)  
    {  
        k=i;  
        for(j=i+1;j<n;j++)  
            if(a[j]<a[k])
                k=j;  
            if(k!=i)  
            {
                    t=a[k];a[k]=a[i];a[i]=t;
            }  
       }  
 }  
   

void heapadjust(int a[],int s,int m)           //堆排序..  
{  
  //功能:若a[s...m]中只有a[s]不滿足堆的定義,調用此函數可以使a[s...m]成爲一個大頂堆  
  //(堆頂元素最大)  
    int   t,j;  
    t=a[s];  
    for(j=2*(s+1);j<=m+1;j*=2)  
    {  
        if(j<m+1&&a[j-1]<a[j])     j++;  
        if(t>=a[j-1])
            break;  
        a[s]=a[j-1];s=j-1;  
    }  
    a[s]=t;  
 }  
   
void heapsort(int a[],int n)         //堆排序.  
 {  
    int i,t;  
    for(i=n/2;i>0;i--)  
        heapadjust(a,i-1,n-1);  
    for(i=n;i>1;i--)  
    {  
        t=a[0];a[0]=a[i-1];a[i-1]=t;  
        heapadjust(a,0,i-2);  
    }  
 }  
   
void JOSort(int a[],int n)                 //奇偶排序  
 {  
    int i,flag,t;  
    do{  
    flag=0;  
    for(i=1;i<n;i+=2)  
    if(a[i]<a[i-1])  
    {flag=1;   t=a[i];a[i]=a[i-1];a[i-1]=t;}  
    for(i=2;i<n;i+=2)  
    if(a[i]<a[i-1])  
    {flag=1;   t=a[i];a[i]=a[i-1];a[i-1]=t;}  
    }while(flag==1);  
  }  
   
   
void countsort1(int a[],int b[],int n)         //記數排序  
{  
          //最差的排序方法  
    int   i,j,count,visited[n];  
    for(i=0;i<n;i++)  
        visited[i]=i;             //爲了辨別a中相同的數而設的標誌數組  
    for(i=0;i<n;i++)  
    {  
        count=0;  
        for(j=0;j<n;j++)  
            if(a[j]<a[i])   count++;  
        while(visited[count]==-1)
       count++;  
        visited[count]=-1;  
        b[count]=a[i];  
    }  
 }  
   
void   countsort2(int a[],int b[],int n)         //記數排序  
{  
          //改進的記數排序  
    int i,j,c[n];  
    for(i=0;i<n;i++)  
        c[i]=0;  
    for(i=0;i<n;i++)  
    {  
        for(j=i+1;j<n;j++)  
            if(a[i]>a[j])   c[i]++;  
            else   c[j]++;  
            b[c[i]]=a[i];  
    }  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章