• 排序汇总


    冒泡排序

    注:最少排序1趟,比较n-1次;最多排序n-1趟,比较n(n-1)/2次。

    #include<iostream>
    #include<stdio.h> using namespace std; int n,a[10005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<n;i++) for(int j=1;j<=n-i;j++) if(a[j]>a[j+1]) swap(a[j],a[j+1]); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }

    选择排序

    注:排序n-1趟,比较n(n-1)次。

    #include<iostream>
    #include<stdio.h> using namespace std; int n,a[10005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) if(a[i]>a[j]) swap(a[i],a[j]); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }

    插入排序

    注:最少比较n-1次,最多比较n(n-1)次。

    对于m个有序的序列,二分查找最坏情况下比较次数为1+log(m),在二分插入排序中,元素比较次数为(n-1)+log(1*2*...*(n-1))

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int n,temp,a[10000005];
    void Sort()  
    {  
        int i,j,k;
        for(i=0;i<n;i++)
        {
            for(j=i-1;j>=0;j--)
                if(a[j]<a[i])    break;
            if(j!=i-1)
            {
                temp=a[i]; 
                for(k=i-1;k>j;k--)  a[k+1]=a[k];
                a[k+1]=temp;
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++)  scanf("%d",&a[i]);
        Sort();
        for(int i=0;i<n;i++)  printf("%d ",a[i]);
    return 0;
    }

    桶排序

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int n,k,num[10000005];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)  scanf("%d",&k),num[k]++;
        for(int i=0;i<=10000005;i++)
            for(int j=num[i];j>=1;j--)  printf("%d ",i);
    return 0;
    }

    快速排序

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int n,a[10000005];
    void Sort(int left,int right)
    {
        int i,j,temp,tp;
        temp=a[left],i=left,j=right;  
        if(left>right)  return;
        while(i!=j)
        {
            while(a[j]>=temp && i<j)  j--;
            while(a[i]<=temp && i<j)  i++;       
            if(i<j)  swap(a[i],a[j]);
        }
        a[left]=a[i],a[i]=temp; 
        Sort(left,i-1);
        Sort(i+1,right);
    return;
    }
    int main()
    {
        scanf("%d",&n);
           for(int i=1;i<=n;i++)  scanf("%d",&a[i]);    
        Sort(1,n);
        for(int i=1;i<=n;i++)  printf("%d ",a[i]);
    return 0;
    }

    STL快速排序

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int n,a[10000005];
    int main()
    {
        scanf("%d",&n);
           for(int i=1;i<=n;i++)  scanf("%d",&a[i]);
        sort(a+1,a+1+n,greater<int>()); //倒序
        for(int i=1;i<=n;i++)  printf("%d ",a[i]);
    return 0;
    }

    堆排序

    注:比较次数较稳定的靠近nlogn

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    void adjustheap(int *arr,int i,int len)
    {
        int j=i*2+1;
        while(j<len)
        {
            if(j+1<len && arr[j]<arr[j+1])  j++;
            if(arr[i]>arr[j])  break;
            swap(arr[i],arr[j]);
            i=j,j=2*i+1;
        }
    }
    void makeheap(int *arr,int n)
    {
        int i;
        for(i=n/2-1;i>=0;i--)  adjustheap(arr,i,n);
    }
    void heapsort(int *arr,int len)
    {
        makeheap(arr,len);
        for(int i=len-1;i>=0;i--)
        {
            swap(arr[i],arr[0]);
            adjustheap(arr,0,i);      
        }
    }
    int main()
    {
        int n,a[10005];
        scanf("%d",&n);
        for(int i=0;i<n;i++)  scanf("%d",&a[i]);
        heapsort(a, n);
        for(int i=0;i<n;i++)  printf("%d ",a[i]);
    return 0;
    }

    STL堆排序

    #include<iostream>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    //priority_queue<int,vector<int>,less<int> > q;
    //priority_queue<int,vector<int>,greater<int> >q;
    priority_queue<int> q;
    int n,x;
    int main()
    {
        scanf("%d",&n);
           for(int i=1;i<=n;i++)  scanf("%d",&x),q.push(x);
        for(int i=1;i<=n;i++)  printf("%d ",q.top()),q.pop();
    return 0;
    }

    归并排序

    注:最少比较nlog2(n)/2次,最多比较nlog2(n)-n+1次。

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int n,a[100005],temp[100005];
    void Sort(int l,int r)
    {
        if(l==r) return;
        int mid=(l+r)>>1;
        Sort(l,mid);
        Sort(mid+1,r);
        int i=l,j=mid+1,k=l;
        while(i<=mid && j<=r)
            if(a[i]<=a[j])  temp[k]=a[i],k++,i++;
            else  temp[k]=a[j],k++,j++;
        while(i<=mid)  temp[k]=a[i],k++,i++;
        while(j<=r)  temp[k]=a[j],k++,j++;
        for(int i=l;i<=r;++i)  a[i]=temp[i];
    return;
    }
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i)  scanf("%d",&a[i]);
        Sort(1,n);
        for(int i=1;i<=n;++i)  printf("%d ",a[i]);
    return 0;
    }

    计数排序

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    const int maxn=1e6+5;
    int n,maxx,a[maxn],b[maxn],rec[maxn],sum[maxn];
    int main() 
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)  scanf("%d",&a[i]),sum[a[i]]++,maxx=max(maxx,a[i]);
        for(int i=1;i<=maxx;i++)  sum[i]+=sum[i-1];
        for(int i=1;i<=n;i++)  rec[i]=sum[a[i]]--;
        for(int i=1;i<=n;i++)  b[rec[i]]=a[i];
        for(int i=1;i<=n;i++)  printf("%d ",b[i]);
    return 0;
    }

     希尔排序

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    void shell_sort(int a[],int size)
    {
        if(a==NULL)  return;
        int h=1;
        while(h<size/3)  h=3*h+1;
        while(h>=1)
        {
            for(int i=h;i<size;i++)
                for(int j=i;j>=h && (a[j]<a[j-h]);j-=h)
                    swap(a[j],a[j-h]);
            h=h/3;
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        int *a=new int(n);
        for(int i=0;i<n;i++)  scanf("%d",&a[i]);
        shell_sort(a,n);
        for(int i=0;i<n;i++)  printf("%d ", a[i]);
    return 0;
    }
  • 相关阅读:
    # 漏洞挖掘技巧清单 #
    CVE-2020-0796——SMBV3客户端/服务端远程代码执行漏洞(远程代码执行+权限提升)
    SSH公钥详细介绍及拓展
    滑动窗口(数据结构)
    反素数解析
    树状数组的基本操作
    Rochambeau POJ
    一般图最大匹配
    2020牛客暑期多校训练营(第一场)H Minimum-cost Flow
    A Bug's Life POJ
  • 原文地址:https://www.cnblogs.com/leaf-2234/p/13781656.html
Copyright © 2020-2023  润新知