• 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);
    }
  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3499581.html
Copyright © 2020-2023  润新知