经典入门_排序

例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("\n");
	}
	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("\n");  
    }  
    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("\n");  
    }  
    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\n", 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\n", buf[i].name ,buf[i].age, buf[i].score);  
        }  
    }  
    return 0;  
}  

  

posted @ 2018-02-03 17:36  Johnny、  阅读(178)  评论(0编辑  收藏  举报