zoukankan      html  css  js  c++  java
  • 经典入门_排序

    例2.1 排序1202

    题目描述:对输入的n个数进行排序并输出。

    输入:输入的第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。

    输出:可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。每组测试数据结果占一行。

     (1)冒泡排序

    冒泡排序的时间复杂度为O(n^2),根据题目给出的n的取值范围,我们可以估算出n^2的数量级仅在万的取值范围中,并没有到达10^7,因此使用冒泡排序在该题的1s运行时间内是完全可以接受的;同时冒泡排序的空间复杂度为O(n),即大致需要100*32bit的内存,这样所需的内存也不会超过限定大小(32MB)。

    #include<stdio.h>
    int main(){
    	int n;
    	int buf[100];
    	while(scanf("%d",&n)!=EOF){
    		for(int i=0;i<n;i++){
    			scanf("%d",&buf[i]);
    		}
    		for(int i=0;i<n;i++){
    			for(int j=0;j<n-1-i;j++){
    				if(buf[j]>buf[j+1]){
    					int tmp=buf[j];
    					buf[j]=buf[j+1];
    					buf[j+1]=tmp;
    				}
    			}
    		}
    		for(int i=0;i<n;i++){
    			printf("%d ",buf[i]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    

      

    (2)快速排序 

    如果修改n的取值范围,使其最大能达到10000,那冒泡排序因其较高的时间复杂度就不能被采用,于是我们不得不使用诸如快速排序、归并排序等具有更优复杂度的排序算法。

    C++已经为我们编写了快速排序库函数,只需调用该函数,便能轻易地完成快速排序。

    #include<stdio.h>  
    #include<algorithm>  
    using namespace std;
    int main()  
    {  
        int n;  
        int buf[10000];  
        while( scanf("%d", &n) != EOF )  
        {  
            for(int i=0; i<n; i++)  
            {  
                scanf("%d", &buf[i] );  
            }   
            sort(buf, buf+n);  
            for( int i=0; i<n; i++ )  
            {  
                printf("%d ", buf[i] );  
            }  
            printf("
    ");  
        }  
        return 0;  
    }  
    

      

    (3)降序排列

    要将给定的数组进行降序排列,可以定义一个cmp函数,来实现新的排序规则的定义,然后调用sort函数的另一种重载方式:sort(排序起始地址,排序结束地址,比较函数。

    #include<stdio.h>  
    #include<algorithm>  
    using namespace std;
    
    bool cmp(int x,int y){
    	return x>y;
    }
    int main()  
    {  
        int n;  
        int buf[10000];  
        while( scanf("%d", &n) != EOF )  
        {  
            for(int i=0; i<n; i++)  
            {  
                scanf("%d", &buf[i] );  
            }   
            sort(buf, buf+n, cmp); //加入比较函数 
            for( int i=0; i<n; i++ )  
            {  
                printf("%d ", buf[i] );  
            }  
            printf("
    ");  
        }  
        return 0;  
    }  
    

      

    例2.2 排序1202

    题目描述:有n个学生的数据,将学生的数据从低到高排序,成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按学生的年龄排序,并输出n个学生排序后的信息。

    输入:输入的第一行有一个整数n(n<=1000)。接下来的n行包括每个学生的姓名(不超过100字符)、年龄(整型)、成绩(小于等于100的正数)。

    输出:根据题目描述的规则输出学生信息,格式如下:姓名 年龄 成绩。

    (1)结构体+cmp

    #include<stdio.h>  
    #include<algorithm>  
    using namespace std;
    
    struct E{
    	char name[101];
    	int age;
    	int score; 
    } buf[1000];
    bool cmp(E a,E b){
    	if(a.score!=b.score) return a.score<b.score;
    	int tmp=a.name-b.name;
    	if(tmp!=0) return tmp<0;
    	else return a.age<b.age;
    }
    int main()  
    {  
        int n;  
        while( scanf("%d", &n) != EOF )  
        {  
            for(int i=0; i<n; i++)  
            {  
                scanf("%s%d%d", buf[i].name, &buf[i].age ,&buf[i].score);  
            }   
            sort(buf, buf+n, cmp); 
            for( int i=0; i<n; i++ )  
            {  
                printf("%s %d %d
    ", buf[i].name ,buf[i].age, buf[i].score);  
            }  
        }  
        return 0;  
    }  
    

      

     (2)直接定义结构体小于运算符

    由于已经指明了结构体的小于运算符,计算机便知道了该结构体的定序规则(sort函数只利用小于运算符来定序,小者在前)。于是在调用sort时,便不必使用第三个参数。

    #include<stdio.h>  
    #include<algorithm>  
    #include<string.h>
    using namespace std;
    
    struct E{
    	char name[101];
    	int age;
    	int score; 
    	bool operator <(const E &b) const{
    		if(score!=b.score) return score<b.score;
    		int tmp=strcmp(name,b.name);
    		if(tmp!=0) return tmp<0;
    		else return age<b.age;
    	}
    } buf[1000];
    int main()  
    {  
        int n;  
        while( scanf("%d", &n) != EOF )  
        {  
            for(int i=0; i<n; i++)  
            {  
                scanf("%s%d%d", buf[i].name, &buf[i].age ,&buf[i].score);  
            }   
            sort(buf, buf+n); 
            for( int i=0; i<n; i++ )  
            {  
                printf("%s %d %d
    ", buf[i].name ,buf[i].age, buf[i].score);  
            }  
        }  
        return 0;  
    }  
    

      

  • 相关阅读:
    03:矩形分割 (二分)
    09:膨胀的木棍 (二分+角度计算)
    A Cubic number and A Cubic Number (二分) HDU
    B
    08:不重复地输出数 (set)
    10:河中跳房子 (二分)
    07:和为给定数 (二分)
    04:网线主管 (二分)
    河中跳房子
    010:输出前k大的数
  • 原文地址:https://www.cnblogs.com/exciting/p/8410163.html
Copyright © 2011-2022 走看看