各類排序算法

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@直接插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include<cstdlib>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
void Swap (int T[],int a);
int main()
{
    int  n;
    cin>>n;
    int T[n];
    for(int i=0;i<n;cin>>T[i],i++);

    for(int i=1;i<n;i++)
    {
          Swap(T, i);
           for(int i=0;i<n;cout<<T[i]<<" ",i++);
           cout<<endl;
    }

}
void Swap (int T[],int a)
{
    int n=a-1;
    int i,j=T[a];
    for( i=n;i>=0;i--)
    {
        if(T[i]>j) T[i+1]=T[i];
        else break;
    }
    if(i!=n)     T[i+1]=j;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@直接插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉法插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;
int Find(int T[],int n)
{
    int a=1,b=n-1;                     //A.B搞混;
    T[0]=T[n];
    while(a!=b)
    {

        if(T[(a+b)/2]>=T[0]&&T[(a+b)/2-1]<=T[0])
            a=b=(a+b)/2;
        else if(T[(a+b)/2]<T[0])   a=(a+b)/2+1;   
        else if(T[(a+b)/2]>T[0])   b=(a+b)/2-1 ;
    }
    for(int i=n;i>a;i--)
        T[i]=T[i-1];
    T[a]=T[0];
}

int main()
{
      int n;
      cin>>n;
      int T[n+1];
      for(int i=1;i<=n;i++)
        cin>>T[i];
      for(int i=2;i<=n;i++)
      {
          if(T[i]<T[i-1])
          {
              Find(T,i);
          }
        for(int i=1;i<=n;i++)
         printf("%d ",T[i]);
         printf("\n");
      }
}

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉法插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@希爾排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>


using namespace std;
void  display(int T[],int n)
{

    for(int i=1;i<=n;i++)
            cout<<T[i]<<" ";
    cout<<endl;
}

int main()
{
    int n;
    cin>>n;
    int T[n+1],increment=n;
    for(int i=1;i<=n;i++)
        cin>>T[i];
    do
    {
           increment=increment/2;
           for(int i=increment+1;i<=n;i++)
           {
               if(T[i]<T[i-increment])
               {
                   T[0]=T[i];
                   int j;
                   for( j=i-increment;j>0;j-=increment)
                   {
                       T[j+increment]=T[j];
                       if(T[0]>=T[j])  break;
                   }
                   T[j+increment]=T[0];
               }

           }
           display(T,n);
    } while(increment>1) ;
}


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@快速排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#include <iostream>
#include <cstdio>
#include <cstdlib>


using namespace std;
int n;                                              //寫個很差 沒有優化 用於display 中 說明數組大小
struct So
{
    int size ;
    int *L;
};
void  display(int T[])
{
    for(int i=1;i<=n;i++)
        cout<<T[i]<<" ";
    cout<<endl;
}
int  Partition(int T[],int low ,int high)
{
    int j=low;
    T[0]=T[low];
    while (low<high)
    {
           for(;T[high]>=T[0]&&high!=low;high--);
            T[j]=T[high];
             j=high;
            for(;T[low]<=T[0]&&high!=low;low++);
           T[j]=T[low];
             j=low;
    }
    T[low]=T[0];
    display(T);
    return low;
}
void Sort(int T[],int low,int high)
{
    if(low>=high)  return ;          //很重要 由於有可能 low>high ,由於若是Sort未排序 則pivotkey=high;
    int pivotkey;
    pivotkey=Partition(T,low,high);
    Sort(T,low,pivotkey-1);      //若是pivotkey=low 則pivotkey-1<low
    Sort(T,pivotkey+1,high);
}
void Quick (So T)
{
    Sort(T.L,1,T.size);
}
int main()
{
   So T;
   cin>>T.size;
    n=T.size;
   T.L=new int [T.size+1];
   for(int i=1;i<=T.size;i++)
    cin>>T.L[i];
    Quick(T);

}

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@堆排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;
int n;                                              //寫個很差 沒有優化 用於display 中 說明數組大小
struct So
{
    int size ;
    int *L;
};
void  display(int T[])
{
    for(int i=1;i<=n;i++)
        cout<<T[i]<<" ";
    cout<<endl;
}

void heapsort(int T[],int s,int m)
{
    int temp=T[s];
    for(int j=2*s;j<=m;j=2*j)
    {
        if(j<m&&T[j]<T[j+1])  j++;//把 m寫成n 使 方程不正確,由於 m 時刻變化 而n 不變。
        if(T[j]<=temp)  break;
        T[s]=T[j];
         s=j;
    }
    T[s]=temp;
}

int main()
{
   So T;
   cin>>T.size;
    n=T.size;
   T.L=new int [T.size+1];
   for(int i=1;i<=T.size;i++)
    cin>>T.L[i];
    for(int i=n/2;i>0;i--)
          heapsort(T.L,i,n);
    for(int i=n;i>1;i--)
    {
        swap(T.L[1],T.L[i]);
        heapsort(T.L,1,i-1);
    }
    display(T.L);
}


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@堆排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;
int   N;
void  Merge(int A[],int B[],int m,int s,int n)
{
    int   enda=s,endb=n,i=m; s++;
    while(m<=enda&&s<=endb)
    {
        if(B[m]<=B[s])  A[i++]=B[m++];
        else A[i++]=B[s++];
    }
    if(m<=enda)  for(;i<=n;) A[i++]=B[m++];
    else  for(;i<=n;) A[i++]=B[s++];
}
void    MSort(int sr[],int th1[],int m,int n)
{
      if(m==n) th1[m]=sr[m];
      else                           //th1 是另外一個的   th2      ;
      {
          int th2[N];
          int  s=(m+n)/2   ;
          MSort(sr,th2,m,s);
          MSort(sr,th2,s+1,n);
          Merge(th1,th2,m,s,n);
      }

}
int main()
{
    int n;
    cin>>n;
    N=n+1;
    int T[n+1],S[n+1];
    for(int i=1;i<=n;i++)
        cin>>T[i];
    MSort(T,S,1,n);
    for(int i=1;i<=n;i++)
        cout<<S[i]<<" ";
    cout<<endl;
}



@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@歸併排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;
int   N;
void  Merge(int A[],int B[],int m,int s,int n)
{
    int   enda=s,endb=n,i=m; s++;
    while(m<=enda&&s<=endb)
    {
        if(B[m]<=B[s])  A[i++]=B[m++];
        else A[i++]=B[s++];
    }
    if(m<=enda)  for(;i<=n;) A[i++]=B[m++];
    else  for(;i<=n;) A[i++]=B[s++];
}
void    MSort(int sr[],int th1[],int m,int n)
{
      if(m==n) th1[m]=sr[m];
      else                           //th1 是另外一個的   th2      ;
      {
          int th2[N];
          int  s=(m+n)/2   ;
          MSort(sr,th2,m,s);
          MSort(sr,th2,s+1,n);
          Merge(th1,th2,m,s,n);
      }

}
int main()
{
    int n;
    cin>>n;
    N=n+1;
    int T[n+1],S[n+1];
    for(int i=1;i<=n;i++)
        cin>>T[i];
    MSort(T,S,1,n);
    for(int i=1;i<=n;i++)
        cout<<S[i]<<" ";
    cout<<endl;
}


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@非遞歸  歸併排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int N;
void  display(int T[])
{
    for(int i=1;i<=N;i++)
        cout<<T[i]<<" ";
    cout<<endl;
}
void  Merge(int A[],int B[],int m,int s,int n)
{
    int   enda=s,endb=n,i=m; s++;
    while(m<=enda&&s<=endb)
    {
        if(B[m]<=B[s])  A[i++]=B[m++];                                   
        else A[i++]=B[s++];
    }
    if(m<=enda)  for(;i<=n;) A[i++]=B[m++];
    else  for(;i<=n;) A[i++]=B[s++];
}
void Mergepass(int SR[],int TR[],int s,int n)
{
      int i=1,j=n/2/s;
      while(j--)
      {
          Merge(TR,SR,i,i+s-1,i+2*s-1);
          i=i+2*s;
      } 
      if(i<n-s+1) Merge(TR,SR,i,i+s-1,n);              	 //三種狀況  一種 是正好 2S 的倍數   第二種是餘S+k(0<k<S) 第三種  就是 2*S+K(0<K<S);
      else for(j=i;j<=n;j++)  TR[j]=SR[j]   ;
      display(TR);
}
void MSort (int T[],int length)
{
      int  k=1;
      int  th[length+1];
      while(k<length)
      {
             Mergepass(T,th,k,length);                           
             k*=2;
             if(k>=length)   break;
            Mergepass(th,T,k,length);
             k*=2;
      }
}

int  main()
{
    int n;
    cin>>n;
    N=n;
    int T[n+1];
    for(int i=1;i<=n;i++)   cin>>T[i] ;
    MSort(T,n) ;

}
相關文章
相關標籤/搜索