14种排序

#include<iostream>

#include<time.h>

using namespace std;

/*

简单插入排序:

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

*/

void Insertion_Sort(int *a,int n)

{

    int i,j;

    for(i=2;i<=n;i++)

        if(a[i]<a[i-1])

        {

            a[0]=a[i];

            for(j=i-1;a[j]>a[0];j--)

                a[j+1]=a[j];

            a[j+1]=a[0];

        }

}

/*

折半插入排序:

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

*/

void Bin_Sort(int *a,int n)

{

    int i,j,low,mid,high;

    for(i=2;i<=n;i++)

        if(a[i]<a[i-1])

        {

            a[0]=a[i];

            low=1;

            high=i-1;

            while(low<=high)

            {

                mid=(low+high)/2;

                if(a[mid]>a[0])

                    high=mid-1;

                else 

                    low=mid+1;

            }

            for(j=i-1;j>high;j--)

                a[j+1]=a[j];

            a[high+1]=a[0];

        }

}

/*选择排序:

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

*/

void Selection_Sort(int *a,int n)

{

    int i,j,k;

    for(i=1;i<n;i++)

    {

        k=i;

        for(j=i+1;j<=n;j++)

            if(a[k]>a[j])

                k=j;

        if(k!=i)    

            swap(a[k],a[i]);

    }

}

/*快速排序

最差时间复杂度:O(n^2)

平均时间复杂度:O(nlogn)

*/

void Quick_Sort(int *a,int low,int high)

{

    int i=low,j=high;

    a[0]=a[low];

    while(low<high)

    {

        while(low<high && a[high]>=a[0])

            high--;

            swap(a[low],a[high]);

        while(low<high && a[low]<=a[0])

            low++;

            swap(a[low],a[high]);

    }

    a[low]=a[0];

    if(i!=low)

        Quick_Sort(a,i,low-1);

    if(j!=high)

        Quick_Sort(a,high+1,j);

}

/*冒泡排序

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

*/

void Bubble_Sort(int *a,int n)

{

    int i;

    bool change=true;

    while(change)

    {

        change=false;

        for(i=1;i<n;i++)

            if(a[i]>a[i+1])

            {

                change=true;

                swap(a[i],a[i+1]);

            }

    }

}

/*鸡尾酒排序(双向冒泡排序):

最差时间复杂度:O(n^2))

平均时间复杂度:O(n^2)

*/

void Cocktail_Sort(int *a,int n)

{

    int i;

    int left=1,right=n;

    bool change=true;

    while(change)

    {

        change=false;

        for(i=left;i<right;i++)

            if(a[i]>a[i+1])

            {

                change=true;

                swap(a[i],a[i+1]);

            }

            right--;

        for(i=right;i>left;i--)

            if(a[i]<a[i-1])

            {

                change=true;

                swap(a[i],a[i-1]);

            }

            left++;

    }

}

/*堆排序

最差时间复杂度:O(nlogn)

平均时间复杂度:O(nlogn)

*/

void Heap_Adjust(int *a,int low,int high)

{

    int i;

    a[0]=a[low];

    for(i=2*low;i<=high;i*=2)

        {

            if(i<high && a[i]<a[i+1])

                i++;

            if(a[0]>=a[i])

                break;

            else 

            {

                a[low]=a[i];

                low=i;

            }

        a[low]=a[0];

        }

}

void Heap_Sort(int *a,int n)

{

    int i;

    for(i=n/2;i>=1;i--)

        Heap_Adjust(a,i,n);

    for(i=n;i>=2;i--)

    {

        swap(a[1],a[i]);

         Heap_Adjust(a,1,i-1);

    }

}

/*

希尔排序

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^1.3)

*/

void Shell_Sort(int *a,int n)

{

    int i,j;

    int gap=n/2;

    while(gap)

    {

        for(i=gap+1;i<=n;i++)

            if(a[i]<a[i-gap])

            {

                a[0]=a[i];

                for(j=i-gap;j>0 && a[j]>a[0];j-=gap)

                    a[j+gap]=a[j];

                a[j+gap]=a[0];

            }

            gap/=2;

    }

}

/*

计数排序:

最差时间复杂度:O(n+k)

平均时间复杂度:O(n+k)

*/

void Counting_Sort(int *a,int n)

{

    int i;

    int max=a[1];

    for(i=2;i<=n;i++)

        {

            if(max<a[i])

            max=a[i];

        }

    int *mark=new int[max+1];

    memset(mark,0,sizeof(int)*(max+1));

    for(i=1;i<=n;i++)

        mark[a[i]]++;

    for(i=1;i<=max;i++)

        mark[i]+=mark[i-1];

    int *p=new int[n+1];

    memset(p,0,sizeof(int)*(n+1));

    for(i=1;i<=n;i++)

        {

            p[mark[a[i]]]=a[i];

            mark[a[i]]--;

        }

    for(i=1;i<=n;i++)

        a[i]=p[i];

}

/*

鸽巢排序:

最差时间复杂度:O(n+N)

平均时间复杂度:O(n+N)

*/

void Pigeonhole_Sort(int *a,int n)

{

    int i,j,k=1;

    int max=a[1];

    for(i=2;i<=n;i++)

        {

            if(max<a[i])

            max=a[i];

        }

    int *mark=new int[max+1];

    memset(mark,0,sizeof(int)*(max+1));

    for(i=1;i<=n;i++)

        mark[a[i]]++;

    for(i=1;i<=max;i++)

    for(j=1;j<=mark[i];j++)

        a[k++]=i;

}

/*

归并排序:

最差时间复杂度:O(nlogn)

平均时间复杂度:O(nlogn)

*/

void Merge(int *a,int low,int mid,int high)

{

    int p,i=low,j=mid+1,k=low;

    int *temp=new int[high+1];

    memset(temp,0,sizeof(int)*(high+1));

    for(;i<=mid && j<=high;k++)

        if(a[i]<a[j])

            temp[k]=a[i++];

        else 

            temp[k]=a[j++];

    if(i<=mid)

        for(p=0;p<=mid-i;p++)

            temp[k+p]=a[i+p];

    if(j<=high)

        for(p=0;p<=high-j;p++)

            temp[k+p]=a[j+p];

    for(p=low;p<=high;p++)

        a[p]=temp[p];

}

void MSort(int *a,int low,int high)

{

    if(low<high)

    {

        int mid=(low+high)/2;

        MSort(a,low,mid);

        MSort(a,mid+1,high);

        Merge(a,low,mid,high);

    }

}

/*

梳排序:

最差时间复杂度:O(nlogn)

平均时间复杂度:O(nlogn)

*/

void Comb_Sort(int *a,int n)

{

    int i;

    int gap=n;

    while(gap/=1.3)

    {

        for(i=gap+1;i<=n;i++)

            if(a[i]<a[i-gap])

                swap(a[i],a[i-gap]);

    }

}

/*

奇偶排序(砖排序):

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

*/

void Odd_Even(int *a,int n)

{

    int i;

    bool change=true;

    while(change)

    {

        change=false;

    for(i=1;i<n;i+=2)

        if(a[i]>a[i+1])

            {

                change=true;

                swap(a[i],a[i+1]);

            }

    for(i=2;i<n;i+=2)

        if(a[i]>a[i+1])

        {

            change=true;

            swap(a[i],a[i+1]);

        }

    }

}

/*

地精排序(侏儒排序):

最差时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

*/

void Gnome_Sort(int *a,int n)

{

    int i=0;

    while(i<n)

    {

        if(i<=0 || (i>=1 && a[i]<=a[i+1]))

            i++;

        else 

        {

            swap(a[i],a[i+1]);

            i--;

        }

    }

}

void Out(int *a,int n)

{

    int i;

    for(i=1;i<=n;i++)

        cout<<a[i]<<" ";

    cout<<endl;

}

int main()

{

    srand((unsigned)time(NULL));

    int *p=new int[16];

    memset(p,0,sizeof(int)*16);

    for(int i=1;i<=15;i++)

    {

        p[i]=rand()%100;

    }

    Out(p,15);

    //Insertion_Sort(p,15);

    //Bin_Sort(p,15);

    //Selection_Sort(p,15);

    //Quick_Sort(p,1,15);

    //Bubble_Sort(p,15);

    //Cocktail_Sort(p,15);

    //Heap_Sort(p,15);

    //Shell_Sort(p,15);

    //Counting_Sort(p,15);

    //Pigeonhole_Sort(p,15);

    //Comb_Sort(p,15);

    //Odd_Even(p,15);

    //MSort(p,1,15);

    Gnome_Sort(p,15);

    Out(p,15);

}

 

你可能感兴趣的:(排序)