zoukankan      html  css  js  c++  java
  • sort函数和next_permutation().prev_permutation()函数的用法。

    1:sort函数:

    sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,

    也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,
    比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include<algorithm>的c++标准库中

    语法:sort(start,end,compare)

    在不写compare参数时,该函数默认为升序排列;

    如:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int A[10]={1,2,5,8,9,5,84,2,2,96};
        sort(A,A+10);
        for(int i=0;i<10;i++)
        {
            cout<<A[i]<<" ";
        }
        return 0;
    }``

    运行结果:

    当然sort函数也可以进行降序排列,不过我们要自己写一个bool的compare函数:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    bool compare(int x,int y)
    {
        return x>y;    
    }
    int main()
    {
        int A[10]={1,2,5,8,9,5,84,2,2,96};
        sort(A,A+10,compare);
        for(int i=0;i<10;i++)
        {
            cout<<A[i]<<" ";
        }
        return 0;
    }

     这样就可以得到降序排列的数了:

     2:next_permutation()和prev_permutation()函数的用法:(#include<algorithm>)

    next_permutation()函数是用来求一个数组的全排列,该函数返回比当前排序较大的排序;

    不用我们自己去写函数了:

    具体用法如下:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int  A[]={1,2,3,4};
         do
         {
             for(int i=0;i<4;i++) cout<<A[i];
             cout<<endl;
         }while(next_permutation(A,A+4));
         return 0;
    }

    输出结果:

     这儿有一个比较典型的例子,大家可以去运用运用:https://www.luogu.org/problemnew/show/P1012

    AC代码:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;
        string A[21];
        for(int i=1;i<=n;i++)
        {
            cin>>A[i];
        }
        string max="0";
        do
        {
            string sum="";
            for(int i=1;i<=n;i++) 
            {
                sum+=A[i];
            }
            if(sum>max) max=sum; 
        }while(next_permutation(A+1,A+n+1));
        cout<<max;
        return 0;
    }

     这个题还有另一种解法:就是我们运用字符串可以加减,还有就是数字字符串可以比较大小来做;

    AC代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;
        string A[21];
        for(int i=1;i<=n;i++)
        {
            cin>>A[i];
        }
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(A[j]+A[j+1]<A[j+1]+A[j])//比较两种加和的方式看那种使结果较大。
                swap(A[j],A[j+1]); 
            }
        }
        for(int i=1;i<=n;i++)
        {
            cout<<A[i];
        }
        return 0;
    }

     prev_permutation()函数返回一个数组的全排列,返回比当前排序较小的序列;

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int A[]={4,3,2,1};
        do
        {
            for(int i=0;i<4;i++)
            {
                 cout<<A[i]<<" ";
            }
            cout<<"  ";
        }while(prev_permutation(A,A+4));
        return 0;
    }

  • 相关阅读:
    一封致想学J2EE的新手的回信
    C#窗体文件与HTML文本文件的相似之处
    Java 文件 获取图片文件的类型
    java 文件 目录和文件的新建、删除、复制、剪切
    java zip递归压缩解压代码
    css + div + js 制作HTML tab control
    使用命令行查看端口与进程
    浅谈php用户身份认证(四)
    日历显示程序
    php中的网页重定向――原创
  • 原文地址:https://www.cnblogs.com/zhoubo123/p/11181294.html
Copyright © 2011-2022 走看看