算例1
- 题目描述
- 解题思路
①冒泡排序的时间复杂度为O(待排序个数的平方),在这里是O(n^2),且1<=n<=100,故此题数量级在万级别,符合要求
②冒泡排序的空间复杂度为O(1)【改】,没超过限制条件,符合要求 - 解题代码
#include <stdio.h>
void main(){
int n,A[100];
while(scanf("%d",&n)!=EOF){//①
for (int i=0;i<n;i++)
scanf("%d",&A[i]);
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++){
if (A[i]>A[j]){
int temp;
temp=A[j];
A[j]=A[i];
A[i]=temp;
}
}
for (int i=0;i<n;i++)
printf("%d ",A[i]);
printf("\n");
}
}
- 注意点
①EOF与NULL的区别:
EOF值为-1,只是普通的整型常量,一般用于输入函数,比如scanf, 或者各种读文件操作函数等。当返回EOF时代表读函数出错,达到了文件尾
NULL值为0,是指针,一般用作指针操作,包括指针类型赋初始值,返回指针类型的函数在出错时的返回值等
(经测试,两者在这里都可以)
②在VC6.0中,退出for循环后,指示变量i依旧可见
③若输入的是字符串,且用的是gets()方法读入,则while循环判断改成while(gets(字符串变量))
算例2
- 题目描述
将原题条件修改n的取值为1<=n<=10000? - 解题思路
时间复杂度已经查过了百万数量级,需要使用快速排序、归并排序等有更优复杂度的排序算法
c++已经为我们编写了快速排序的库函数 - 解题代码
#include <stdio.h>
#include <algorithm>
using namespace std;
//````````````````
sort(A,A+n);
//`````````````````
- 注意点
①sort函数:并不是简单的快速排序,而是结合了堆排序和插入排序,可以根据输入数组的特点进行选择。比如数据量较大时采用快排,分段递归,每段数量较小后采用插入,如果递归太深,采用堆排序
时间复杂度为n*lg(n)
使用形式:sort(first_pointer,first_pointer+n,cmp);cmp为自定义比较函数名称,不写默认为升序排序
算例3
- 题目描述
将原题条件修改为 降序排序 - 解题思路
①方案一:降序排序后,将数组倒序输出
②方案二:编写cmp函数自定义降序排序规则 - 解题代码
#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int x,int y){
return x>y;
}
int main(){
int n , A[100];
while(scanf("%d",&n)!=EOF){
for (int i=0;i<n;i++)
scanf("%d",&A[i]);
sort(A,A+n,cmp);
for (int i = 0;i < n;i ++)
printf( "%d " ,A[i]);
printf ( "\n" );
}
return 0;
}
- 注意点
①当cmp函数返回true时,表示第一个参数x会排在第二个参数y前面,算例中表示,当x>y时,s排在y前面
②其可以为int、double、char等类型数据排序
算例4
- 题目描述
- 解题思路
①这里需要对结构体进行排序,使用sort自定义比较函数cmp会比较方便 - 解题代码
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct stu {
char name[100];//②
int age;
int score;
}s[1000];
bool cmp(stu A, stu B) { //①
if (A.score != B.score)
return (A.score < B.score);
if (strcmp(A.name, B.name) != 0)
return (strcmp(A.name, B.name) < 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", s[i].name, &s[i].age, &s[i].score);
sort(s, s + N, cmp);
for (int i = 0;i < N;i++)
printf("%s %d %d\n", s[i].name, s[i].age, s[i].score);
}
return 0;
}
- 注意点
①重点注意cmp函数的写法
②scanf("%s",s[i].name) 不用&
③关于char的输出:
i. 满10个字符输出
char a[10];
for (int i=0;i<10;i++)
scanf("%c",&a[i]);
for (int i=0;i<10;i++)
printf("%c",a[i]);
ii. 输出错误
char a[10];
for (int i=0;i<10;i++)
scanf("%c",&a[i]);
printf("%s",a);
char a[10];
scanf("%s",&a);
for (int i=0;i<10;i++)
printf("%c",a[i]);
iii.输出正确
char a[10];
scanf("%s",a);
printf("%s",a);
算例5
- 题目描述
用重载<符号方法实现结构体排序(按上题) - 解题思路
①重载一个结构体比大小的符号,让系统知道结构体是这样比大小的哦!然后就不用编写cmp函数了 - 解题代码
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct stu {
char name[100];
int age;
int score;
bool operator < (const stu& t)const {
if (score != t.score)
return (score < t.score);
if (strcmp(name, t.name) != 0)
return (strcmp(name, t.name) < 0);
else
return (age < t.age);
}
}s[1000];
int main(){
int N;
while (scanf("%d", &N) != EOF) {
for (int i = 0; i < N;i++) {
scanf("%s%d%d", s[i].name, &s[i].age, &s[i].score);
}
sort(s, s+N);
for (int i = 0;i < N;i++)
printf("%s %d %d\n", s[i].name, s[i].age , s[i].score);
}
return 0;
}
- 注意点
①重载<要是不熟悉,赶紧掌握(背下来)~