经典入门_排序
例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; }