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);
}
原文地址:https://www.cnblogs.com/wc1903036673/p/3499581.html