(一)王道机试指南___排序

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

  • 注意点
    ①重载<要是不熟悉,赶紧掌握(背下来)~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40614231/article/details/83476935