zoukankan      html  css  js  c++  java
  • sort 函数的应用

    做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。
        这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说, 有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。
        拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);
        对向量v排序也差不多,sort(v.begin(),v.end());
        排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
        如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
    bool cmp(int a,int b)
    {
        return a>b;
    }
       排序的时候就写sort(a,a+100,cmp);

       假设自己定义了一个结构体node
    struct node{
        int a;
        int b;
        double c;
    }
       有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:
    以下是代码片段:
    bool cmp(node x,node y)
    {
         if(x.a!=y.a) return x.a

    if(x.b!=y.b) return x.b>y.b;
         return return x.c>y.c;
    }     排序时写sort(arr,a+100,cmp);

        最后看一个完整的实例,初赛时的一道题目“文件名排序 ”。
    以下是代码片段:
    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    //定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")
    struct node{
     string a,b;
    };
    //ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z'
    //而这题要求忽略大小写,所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思
    //先把两个字符串全部转化为小写,再比较大小(字典序)
    bool lt(string x,string y)
    {
     int i;
     for(i=0;i<x.length();i++)
      if(x[i]>='A'&&x[i]<='Z')
       x[i]='a'+(x[i]-'A');
     for(i=0;i<y.length();i++)
      if(y[i]>='A'&&y[i]<='Z')
       y[i]='a'+(y[i]-'A');
     return x<y;
    }
    //自定义的比较函数,先按b值升序排列(也就是"Dir"排在"File"前面)
    //如果b值相同,再按a升序排列,用的是刚才定义的lt函数
    bool comp(node x,node y)
    {
     if(x.b!=y.b)return x.b<y.b;
     return lt(x.a,y.a);
    }
    int main()
    {
     node arr[10001];
     int size=0;
     while(cin>>arr[size].a>>arr[size].b)
      size++;
     sort(arr,arr+size,comp);
     for(int i=0;i<size;i++)
      cout<<arr[i].a<<" "<<arr[i].b<<endl;
     return 0;
    }


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/s030501408/archive/2010/02/26/5329477.aspx

  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/zibuyu/p/2943422.html
Copyright © 2011-2022 走看看