例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;
}