• 计算机考研机试指南-第二章


    1.程序一秒的运行时限,所设计的算法复杂度不能超过百万级别,即不能超过1千万。若算法复杂度是O(n^2),则该n不应大于3000,否则会达到千万数量级复杂度。

    2.qsort 的使用方法:

    一、对int类型数组排序

    int num[100];

    int cmp ( const void *a , const void *b )

    {

      return *(int *)a - *(int *)b;  //升序排序

    //return *(int *)b - *(int *)a; //降序排序

    /*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。

            升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。

            降序排列时,则刚好相反。

    */

    }

    qsort(s,n,sizeof(s[0]),cmp);

    示例完整函数(已在 VC6.0上运行通过):

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int s[10000],n,i;
    int cmp(const void *a,const void *b)
    {
    return(*(int *)b-*(int *)a);  //实现的是降序排序
    }
    int main()
    {

    // 输入想要输入的数的个数
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&s[i]);
    qsort(s,n,sizeof(s[0]),cmp);
    for(i=0;i<n;i++)
    printf("%d ",s[i]);
    return(0);
    }

      

    二、对char类型数组排序(同int类型)

    char word[100];

    int cmp( const void *a , const void *b )

    {

    //注意,网上很多版本是 “ return *(char *)a - *(int *)b;  ” 

    //因为编辑者的不用心,盲目copy,以讹传讹,传的一直是错的 *(int *)b

    //应该是return *(char *)a - *(char *)b;

    return *(char *)a - *(char *)b;

    }

    qsort(word,100,sizeof(word[0]),cmp);

    //附,可能 getchar();  会派上用场 

    三、对double类型数组排序(特别要注意)

    double in[100];

    int cmp( const void *a , const void *b )

    {

    return *(double *)a > *(double *)b ? 1 : -1;

    //返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失,用一个判断返回值。

    }

    qsort(in,100,sizeof(in[0]),cmp);

     //附:排序结果的输出,一般建议用 “ %g ” 格式

    /* 在这里多嘴一句,"%g"格式输出 虽然书上是说系统会自动选择 " %f " 格式  和 " %e " 格式 中长度较短的格式,并去掉无意义的0,但实际上系统如果选择了" %e ",系统会输出比 “ %e " 格式更省一位的格式输出。(此结论,来自VC6.0的实际操作)*/

    四、对结构体一级排序

    struct In

    {

    double data;

    int other;

    }s[100]

    //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写

    int cmp( const void *a ,const void *b)

    {

    return (*(In *)a).data > (*(In *)b).data ? 1 : -1;

    //注意,这条语句在VC6.0环境下运行可能会出错,但是并不是语句错了,而是你要先 Build ,或者全部重建。总之语句是对的。

    //或者你可以将这上面1条语句改成下面这3条语句

    //struct In *aa = (In *)a;
    //struct In *bb = (In *)b;
    //return aa->data > bb->data ? 1 : -1;

    }

    qsort(s,100,sizeof(s[0]),cmp);

    五、对结构体二级排序

    struct In

    {

    int x;   //你可以比喻成:失败次数

    int y;   //你可以比喻成:成功次数

    }s[100];

    //按照x从小到大排序,当x相等时按照y从大到小排序。 你可以想象成:失败是主要因素的一个问题,先比较 失败次数少,失败次数相同 再看 成功次数多。

    int cmp( const void *a , const void *b )

    {

    struct In *c = (In *)a;

    struct In *d = (In *)b;

    if(c->x != d->x) return c->x - d->x;

    else return d->y - c->y;

    }

    qsort(s,100,sizeof(s[0]),cmp);

    六、对字符串进行排序

    struct In

    {

    int data;

    char str[100];

    }s[100];

    //按照结构体中字符串str的字典顺序排序

    int cmp ( const void *a , const void *b )

    {

    return strcmp( (*(In *)a)->str , (*(In *)b)->str );

    }

    qsort(s,100,sizeof(s[0]),cmp);

    注意!qsort 中的  cmp 得自己写 。

    C++sort()的用法:

    默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int cmp(int a,int b)
    {
      if(a<b)
      return 1; //升序排列,如果改为 a >b,则为降序,要注意sort()中cmp()的返值只有1和0,不像qsort中存在-1!!!!
      else
      return 0;
    }


    int main(){
        int i;
     int a[20];
     for(int i=0;i<5;++i)
      cin>>a[i];

    sort(a,a+5,cmp);          //范围,很明显这里是a+5 注意,这是必要的,如果是a+4最后一个值a[4]就不会参与排序。
    for(i=0;i<5;i++)       

    cout<<a[i]<<endl;
        system("pause");
     return 0;
    }

    对二维数组的排序:
    #include <iostream>
    #include <algorithm>
    #include <ctime>
    using namespace std;

    bool cmp(int *p,int *q)
    {
        if(p[0]==q[0])
        {
            if(p[1]==q[1])
            {
                return p[2]<q[2];
            }
            else return p[1]<q[1];
        }
        else return p[0]<q[0];
    }
    int main()
    {
        srand(time(0));
        int i;
        int **a=new int*[1000];
        for(i=0;i<1000;++i)
        {
            a[i]=new int[3];
            a[i][0]=rand()%1000;
            a[i][1]=rand()%1000;
            a[i][2]=rand()%1000;
            //printf("%d %d %d ",a[i][0],a[i][1],a[i][2]);
        }
        sort(a,a+1000,cmp);
        /*cout<<"After sort"<<endl;
        for(i=0;i<1000;++i)
        {
            printf("%d %d %d ",a[i][0],a[i][1],a[i][2]);
        }*/
        return 0;
    }

    推荐sort用法

    3. int  strcmp(const * char, const * char );

    C/C++函数,比较两个字符串
    设这两个字符串为str1,str2,
    若str1==str2,则返回零;
    若str1<str2,则返回负数;
    若str1>str2,则返回正数。
      A的子母序比a靠前,因为A的asc码比a小
     
    4.<string> 与<string.h>、<cstring>的区别
    <string.h>

    <string.h>是C版本的头文件,包含比如strcpy、strcat之类的字符串处理函数。
    <cstring>
    在C++标准化(1998年)过程中,为了兼容以前,标准化组织将所有这些文件都进行了新的定义,加入到了标准库中,加入后的文件名就新增了一个"c"前缀并且去掉了.h的后缀名,所以string.h头文件成了cstring头文件。但是其实现却是相同的或是兼容以前的,这就是<cstring>的来源,不要觉得又多了一个东西。相当于标准库组织给它盖了个章,说“你也是我的标准程序库的一份子了”。
    <string>
    <string>是C++标准定义的头文件,它定义了一个string的字符串类,里面包含了string类的各种操作,如s.size(), s.erase(), s.insert()等。但<string>又包含了老的C版本的字符串操作如strcpy、strcat等,这就相当于,在<string>的文件中除了定义自己的string类之外,还加了一个#include<string.h>一句包含了C版本的字符串操作。

    5.const的使用

    2、指针使用CONST
    (1)指针本身是常量不可变
         char* const pContent; 

    (2)指针所指向的内容是常量不可变
         const char *pContent; 

    (3)两者都不可变
          const char* const pContent; 

    4、类相关CONST

    (1)const修饰成员变量
    const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
    class A
    {

    const int nValue; //成员常量不能被修改

    A(int x): nValue(x) { } ; //只能在初始化列表中赋值
    }

    (2)const修饰成员函数
    const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
    class A
    {

    void function()const; //常成员函数, 它不改变对象的成员变量.

    //也不能调用类中任何非const成员函数。
    }

    对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

    a. const成员函数不被允许修改它所在对象的任何一个数据成员。

    b. const成员函数能够访问对象的const成员,而其他成员函数不可以。

    (3)const修饰类对象/对象指针/对象引用

    · const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

    · const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
    例如:
    class AAA
    {
    void func1();
    void func2() const;
    }
    const AAA aObj;
    aObj.func1(); ×
    aObj.func2(); 正确

    const AAA* aObj = new AAA();
    aObj-> func1(); ×
    aObj-> func2(); 正确

    三、将Const类型转化为非Const类型的方法

    采用const_cast 进行转换。
    用法:const_cast <type_id> (expression)
    该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

    · 常量指针被转化成非常量指针,并且仍然指向原来的对象;

    · 常量引用被转换成非常量引用,并且仍然指向原来的对象;

    · 常量对象被转换成非常量对象。

    5.直接在struct中写operator<操作,比重新写一个cmp函数,在调用sort函数时,耗时少

        

  • 相关阅读:
    Cannot set property 'branchdata' of undefined
    关闭Vue Eslint语法检查
    Webpack前世今生
    SpringCloud 之 Netflix Hystrix 服务监控
    Spring Cloud 之 Netflix Hystrix 服务容错
    Java设计模式之建造者模式(Builder Pattern)
    Java设计模式之工厂模式(Factory Pattern)
    数据库表的字段有默认值,如何修改或者去掉这个默认值
    前端基础进阶(十五):详解 ES6 Modules
    JS基础知识题(中)作用域、闭包
  • 原文地址:https://www.cnblogs.com/--CYH--/p/6911633.html
Copyright © 2020-2023  润新知