• 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);
    }
  • 相关阅读:
    mysql数据库中的锁
    HihoCoder
    旅游规划(双权连通图)
    单调栈的原理
    战争联盟(并查集)
    点赞狂魔(巧用STL容器事半功倍)
    这是二叉搜索树吗?
    好像是两种权的dijkstra
    pat--046.整除光棍(除法模拟)
    幸运数字 2
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3499581.html
Copyright © 2020-2023  润新知