zoukankan      html  css  js  c++  java
  • LDU新生授课1——数组函数结构体排序

    时间和空间复杂度问题

    时间复杂度计算方法:可以理解为循环次数

    空间复杂度:空间一维开到5e6+7极限,二维开一般1100*1100。无论几维,总体每个不超1e7。

    比如

    int a[1100][1100]//合法
    int a[11000][11000]//不合法
    

    一维数组的下标问题

    int a[10];
    for(int i=0;i<10;i++) cout<<a[i]<<endl;
    //下标可用范围只有0~n-1,不要用n和负数!
    

    数组过大时无法输入的问题

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+7;
    int a[maxn];//将数组定义在main外
    int main(){
    	return 0;
    }
    

    memset用法(格式化)

    前言:sizeof(x)函数表示返回x的字节大小

    memset(vis,0,sizeof(vis));//对数组的初始化操作 数组名,初始化赋值,赋值区域大小
    一般初始化为0,1,-1
    全局变量的数组自动赋值为0,局部变量开始是随机数。
    初始化结构体一般不用memset,因为结构体中还有其他类型的数组如char类型。一般用for循环初始化结构体或是当用到的时候先初始化。

    memset(a,b,c);
    //a表示想要格式化的数组,b想要将数组赋给的值,c想要赋值的长度
    //一般情况下b的值为0,1,-1,0x3f(最后一个表示赋值为最大值)
    //一般情况下,c=sizeof(a),也可简化写成sizeof a
    
    memset(a,-1,sizeof(a));//表示将a数组全部赋值为-1
    memset(a,0x3f,sizeof a);///表示将a数组全部赋值为0x3f3f3f3f
    for(int i=0;i<maxn;i++) a[i]=-1;///等同于第一句
    

    二维数组

    看成一维数组套一维数组即可,掌握遍历后可做UPC的排序

    结构体

    定义

    struct node{
    	char name[100];
    	char place[100];
    	int sale;
    	double price;	
       	string s;
    }a[100];
    

    或者

    struct node{
    	char name[100];
    	char place[100];
    	int sale;
    	double price;	
    	string s;
    };
    node a[100];//可放在main函数里也可放在main函数外
    

    调用:

    输入.后再自行选择选项

    排序

    #include<algorithm>//c++
    sort(a,b,c);//位于algorithm库,必须加上此库或是用万能头
    

    其中a为开始排序的位置,b为排序结束的位置,c为排序方式;
    默认的排序方式为整数从小到大,如果想按照其他排序方式的话,则需要提前定义。

    bool cmp(int a,int b)//一般整数排序
    {
        return a>b;
    }
    bool cmp(node a,node b)//一般结构体排序
    {
        return a.x>b.x;
    }
    

    关于起始位置

    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    

    or

    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    

    例题分析:
    在这里插入图片描述
    在这里插入图片描述

    #include<cstdio>
    #include<cstdlib> 
    #include<cstring>
    #include<algorithm> 
    using namespace std; 
    struct Node{ 
    	char name[100];
    	char place[100];
    	int sale;
    	
     }a[1100];
    bool cmp(Node a,Node b)
    {
    	if(strcmp(a.place,b.place) == 0)
    		return strcmp(a.name,b.name)<0;
    	else
    		return strcmp(a.place,b.place)<0;
    } 
    int main()
    { 
    	int N,M,i;
    	scanf("%d",&N);
    	while(N--)
    	{
    		scanf("%d",&M);
    		int cnt = 0;//计数器 
    		for(i=1;i<=M;i++){
    			Node tmp;//定义一个同类型的结构体来储存当前的输入数据 
    			scanf("%s%s%d",tmp.name,tmp.place,&tmp.sale);
    			int flag = 0;//用于后面判断tmp是存在于当前结构体还是下一结构体 
    			for(int j=1;j<i;j++)
    			{
    				if(strcmp(tmp.name,a[j].name)==0&&strcmp(tmp.place,a[j].place)==0)//相同产地相同名字 
    				{
    					a[j].sale += tmp.sale;//加到前面的结构体里 
    					flag = 1;
    					break; 
    				}
    			}
    			if(!flag) a[++cnt] = tmp;//不同产地不同名字 就把他加到结构体本位里 ,然后计数器自增1 
    		}
    		
    		sort(a+1,a+cnt+1,cmp);//排序 
    		for(i=1;i<=cnt;i++){
    			if(strcmp(a[i].place,a[i-1].place)!=0)//不同产地 
    				printf("%s
       |----%s(%d)
    ",a[i].place,a[i].name,a[i].sale);
    			else if(strcmp(a[i].place,a[i-1].place)==0)//相同产地 
    				printf("   |----%s(%d)
    ",a[i].name,a[i].sale);		
    		}	
    
    		if(N!=0) printf("
    ");
    	}
    	return 0; 
    }
     
    
  • 相关阅读:
    整理+学习《骆昊-Java面试题全集(下)》
    整理+学习《骆昊-Java面试题全集(中)》
    Linux专家心目中的最佳Linux发行版有哪些?
    常用的Git Tips
    Python 3 加密简介
    LXD 2.0 系列(一):LXD 入门
    英特尔构建云集成编排工具
    Unix操作系统中UUCP知识详细讲解
    Windows 的 AD 域寄生于 Linux 机器
    Git秘籍:在 Git 中进行版本回退
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853103.html
Copyright © 2011-2022 走看看