1. 程式人生 > >順序表儲存實現氣泡排序,選擇排序,插入排序,希爾排序,基數排序

順序表儲存實現氣泡排序,選擇排序,插入排序,希爾排序,基數排序

#include<iostream>
using namespace std;
const int MAXSIZE = 100;
typedef int ElemType;
struct Data
{
    ElemType key;
//    int shu;
    int point;
};

//Data ar[MAXSIZE], br[MAXSIZE];
int yx(int m, int i);
template<class T>void bubblesort(T r[], int n);
template<class T>void quicksort(T a[], int l, int h);
template<class T>int hoarse(T a[], int l, int h);
template<class T>void stinsort(T a[], int n);
template<class T>void shellsort(T a[], int n);
template<class T>int radixsort(T r[], int n);
void generate(Data ary[],int count)
{
    long int a = 1001;
    int i;
    ary[0].key=0;
    ary[0].point=0;
    for(i = 1; i<=count; i++)
    {
        a = (a*125)%5757;
        ary[i].key = (int)a;
        ary[i].point = 0;
    }
}

void prdata(Data ary[], int count)
{
    int i;
    char ch;
    cout<<"\n 資料輸出\n";
    for(i=1; i<=count; i++)
        cout<<"\t"<<ary[i].key;
    cout<<"\n\n 結束顯示";
}

template<class T>void bubblesort(T r[], int n)
{
    int i=1,tag,m;
    T x;
    do
    {
        tag = 0;
        x = r[i];
        for(int j=n;j>i;j--)
        {
            if(r[j].key<r[j-1].key)
            {
                x = r[j];
                r[j] = r[j-1];
                r[j-1] = x;
                tag = 1;
            }
        }
        i++;
    }while(tag==1 && i<n);
}

template<class T>int hoarse(T a[], int l, int h)
{
    int i,j;
    T x;
    i = l;
    j = h;
    x.key = a[i].key;
    do
    {
        while(i<j && a[j].key>=x.key)
            j--;
        if(i<j)
        {
            a[i].key = a[j].key;
            i++;
        }
        while(i<j && a[i].key<=x.key)
            i++;
        if(i<j)
        {
            a[j].key = a[i].key;
            j--;
        }
    }while(i<j);
    a[i].key = x.key;
    return i;
}

template<class T>void quicksort(T a[], int l,int h)
{
    int i;
    if(l<h)
    {
        i = hoarse(a, l, h);
        quicksort(a,l,i-1);
        quicksort(a,i+1,h);
    }
}

template<class T>void stinsort(T a[], int n)
{
    T x;
    for(int j=2;j<=n;j++)
    {
        bool tag = false;
        x.key = a[j].key;
        int i=1;
        while(tag == false &&i<j)
        {
            if(x.key>a[i].key)
                i++;
            else
                tag = true;
        }
        if(i<j && tag ==true)
        {
            for(int k=j-1;k>=i;k--)
                a[k+1]=a[k];
        }
        a[i].key=x.key;
    }
}

template<class T>void shellsort(T a[], int n)
{
    T x;
    int d[] = {8,4,2,1,0};
    for(int i=0;d[i]!=0;i++)
    {
        int dd = d[i];
        for(int j=0;j<=dd;j++)
        {
           /* for(int p=j;p<=n;p+=dd)*/
            //{
                //int pp = j;
                //bool tag = false;
                //x = a[p];
                //while(pp<p && tag==false)
                //{
                    //if(a[pp].key<x.key)
                        //pp+=dd;
                    //else
                        //tag = true;
                //}
                //if(pp<p)
                //{
                    //int k = p;
                    //for(;k>pp;k-=dd)
                        //a[k].key = a[k-dd].key;
                    //a[k].key = x.key;
                //}
            /*}*/
            for(int p=n-j;p>dd;p-=dd)
            {
                x = a[p];
                int pp = p-dd;
                while(pp>=0 && a[pp].key>x.key)
                {
                    a[pp+dd].key = a[pp].key;
                    pp-=dd;
                }
                a[pp+dd].key = x.key;
            }

        }
/*        for(int j=n;j>n-dd;j--)*/
        //{
            //x = a[j];
            //int p = j-dd;
            //bool tag = false;
            //while(p>=1 && tag==false)
            //{
                //if(a[p].key>x.key)
                //{
                    //a[p+dd].key = a[p].key;
                    //p-=dd;
                //}
                //else
                    //tag = true;
                //if(p<j-dd)
                    //a[p+dd].key = x.key;
            //}
        /*}*/
    }
}

int yx(int m, int i)
{
    int x;
    switch(i)
    {
        case 1:
            x = m%10;
            break;
        case 2:
            x = (m%100)/10;
            break;
        case 3:
            x = (m%1000)/100;
            break;
        case 4:
            x = (m%10000)/1000;
            break;
        default:
            break;
    }
    return x;
}

template<class T>int radixsort(T r[], int n)
{
    int f[10],e[10];
    for(int i=1;i<n;i++)
        r[i].point = i+1;
    r[n].point = 0;
    int p = 1;
    for(int i=1;i<=4;i++)
    {
        for(int j=0;j<10;j++)
        {
            f[j]=0;
            e[j]=0;
        }
        while(p!=0)
        {
            int k=yx(r[p].key,i);
            if(f[k]==0)
            {
                f[k]=p;
                e[k]=p;
            }
            else
            {
                int l = e[k];
                r[l].point = p;
                e[k] = p;
            }
            p = r[p].point;
        }
        int j = 0;
        while(f[j]==0)
            j++;
        p = f[j];
        int t = e[j];
        while(j<10)
        {
            j++;
            while(j<10 && f[j]==0)
                j++;
            if(j<10 && f[j]!=0)
            {
                r[t].point = f[j];
                t = e[j];
            }
            r[t].point = 0;
        }
    }
    return p;
}

int main(int argc, char *argv[])
{
    int k,n,j,m;
    char ch;
    Data ar[MAXSIZE],br[MAXSIZE];
    cout<<"\n\n 1.產生一批隨機數準備排序";
    cout<<"\n 2.一般情況的氣泡排序";
    cout<<"\n 3.有序情況的氣泡排序";
    cout<<"\n 4.一般情況選擇排序";
    cout<<"\n 5.有序情況的快速排序";
    cout<<"\n 6.插入排序";
    cout<<"\n 7.希爾排序";
    cout<<"\n 8.基數排序";
    cout<<"\n 9.結束程式";
    cout<<"\n---------------------------------";
    cout<<"\n 請輸入你的選擇:";
    cin>>k;
    while(k>0&&k<9)
    {
        switch(k)
        {
            case 1:
                cout<<"\n資料數目:";
                cin>>n;
                generate(ar, n);
                for(j=0; j<=n;j++)
                    br[j]=ar[j];
                prdata(ar,n);
                break;
            case 2:
                for(j=0;j<=n;j++)
                    ar[j] = br[j];
                bubblesort(ar,n);
                prdata(ar,n);
                break;
            case 3:
                bubblesort(ar,n);
                prdata(ar,n);
                break;
            case 4:
                for(j=0;j<=n;j++)
                    ar[j]=br[j];
                quicksort(ar,1,n);
                prdata(ar,n);
                break;
            case 5:
                quicksort(ar,1,n);
                prdata(ar,n);
                break;
            case 6:
                for(j=0;j<=n;j++)
                    ar[j]=br[j];
                stinsort(ar,n);
                prdata(ar,n);
                break;
            case 7:
                for(j=0;j<=n;j++)
                    ar[j]=br[j];
                shellsort(ar,n);
                prdata(ar,n);
                break;
            case 8:
                for(j=0;j<=n;j++)
                    ar[j]=br[j];
                m = radixsort(ar,n);
                cout<<"\n";
                while(m!=0)
                {
                    cout<<"\t"<<ar[m].key;
                    m = ar[m].point;
                }
            default:
                break;
        }
        cout<<"\n---------------------------------";
        cout<<"\n 請輸入你的選擇:";
        cin>>k;
    }   
    cout<<"\n\n 程式結束";
    return 0;
}