3.1排序
例题3.1 排序
sort函数初使用。
题目描述:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
int arr[101];
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++ i) {
scanf("%d", &arr[i]);
}
sort(arr, arr+n);//排序
sort方法中传入数组首个元素的地址以及尾后地址,即左闭右开。
for (int i = 0; i < n; ++ i) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
sort函数中自定义排序规则。
//sort函数中自定义排序规则
//即修改比较和交换规则,
//改为逆序
bool comp(int lhs, int rhs) {
//不发生交换的条件下返回真->因此在对sort函数进行改造的时候,要明确什么情况下不发生交换!
if (lhs >rhs) {//左边比右边大不发生交换->逆序
return true;
}else {
return false;
}
}
int main()
{
int arr[8];
for (int i = 0; i < 8; ++i) {
scanf("%d", &arr[i]);//&arr[i] 和 arr+i等价
}
sort(arr, arr+8, comp); //comp后面不加()
for (int i = 0; i < 8; ++i)
{
printf("%d ", arr[i]);
}
例题3.2 成绩排序1
题目描述:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//声明一个学生类
struct Student {
int number; //学号
int score; //成绩
};
//修改sort排序规则
bool compare (Student x, Student y) {
if (x.score < y.score) {
return true;
} else if (x.score == y.score && x.number < y.number) {
return true;
}else {
return false;
}
}
int main()
{
const int MAXN = 100;
Student arr[MAXN];
int n;
while (scanf ("%d", &n) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d%d", &arr[i].number, &arr[i].score);
}
sort(arr, arr+n, compare);
for (int i = 0; i < n; ++i) {
printf("%d %d \n", arr[i].number, arr[i].score);
}
}
return 0;
}
例题3.3 成绩排序2
成绩排序
题目描述:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
//例题3.3 成绩排序
//输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排序。
//相同成绩都按先录入者排列在前的规则处理
//先输入个数,再输入排序方法,0降序,1升序,再分别输入名字成绩,一个空格隔开
struct User {
char name[20]; //用户名
int score; //成绩
int order; //输入次序
};
//自定义排序规则,不交换的情况下返回true
bool comp0 (User x, User y) {
//降序比较函数
if (x.score == y.score && x.order < y.order) {
//成绩相等比较次序
return true;
}else if (x.score < y.score) {
return true;
}else {
return false;
}
}
bool comp1 (User x, User y) {
//升序比较函数
if (x.score == y.score && x.order < y.order) {
//成绩相等比较次序
return true;
}else if (x.score > y.score) {
return true;
}else {
return false;
}
}
int main()
{
int n; //数组大小
int type; //升序 or 降序
User arr[100];
while (scanf("%d%d", &n,&type) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%s%d", arr[i].name, &arr[i].score);
arr[i].order = i;
}
if (type == 1) {
sort(arr, arr+n, comp1);
}else {
sort(arr, arr+n, comp0);
}
for (int i = 0; i < n; ++i) {
printf("%s %d", arr[i].name, arr[i].score);
printf("\n");
}
}
return 0;
}
此类警告会导致scanf无法正常输入数据,虽然能运行,但是输入数据后输出乱码。
经过调试检查后发现是因为在scanf函数中把%写在了s后面,如图:
更正后再构建:
3.2 查找
例题3.4 找x
题目描述:
#include <iostream>
using namespace std;
//例题3.4 找x
int arr[200];
int main()
{
int n;
while (scanf("%d", &n)!= EOF)
{
for (int i = 0; i < n; ++ i)
{
scanf("%d", arr+i);
}
int x;
scanf("%d", &x);
int j;
int flag = -1;
for ( j = 0; j < n; ++j)
{
if (arr[j] == x)
{
flag = j;
break;
}
}
printf("%d",flag);
}
return 0;
}
例题 3.5 查找
题目描述:
输入:数组长度n,输出入数组a[1…n], 输入查找次数m,输入查找数字b[1…m]
输出:根据查找结果输出YES或NO
思路1.:先声明一个足够大的数组用于存放数组n,输入n数组后,先进行sort排序,方便后续使用二分查找。
对于要查找的m个数字b,依次输入并通过bool Binarysort函数直接判断是否在n数组中,在的话输出YES,否则输出false。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//例题3.5 查找
const int MAXN = 100;
int arr[MAXN];
bool BinarySearch(int n, int x) {
int low = 0, high = n-1;
while (low <= high) {
int mid = (low + high)/2;
if (x > arr[mid]) {
low = mid + 1;
}else if (x < arr[mid]){
high = mid - 1;
}else {
return true;
}
}
return false;
}
int main()
{
int n, m;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d", arr+i);
}
sort(arr, arr+n); //先排序后查找
scanf("%d", &m);
for (int i = 0; i < m; ++i) {
int target;
scanf("%d", &target);
if (BinarySearch(n,target)) {
printf("YES\n");
}else {
printf("NO\n");
}
}
}
return 0;
}
思路2.:用map处理查找问题。声明一个map,将数组n的元素作为键,数组元素的下标作为值,插入到map当中。然后使用map中的find函数返回迭代器,用于判断数字b是否在数组n中。map中find的底层逻辑是二叉查找树,因此并不会比二分查找的时间复杂度更高,但是会有更高的空间复杂度。
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
//例题3.5 使用map来处理查找问题
int main()
{
int n, m;
int arr[101];
map<int, int> findIndex;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++ i) {
scanf("%d", arr+i);
//将数组的元素作为键,数组下标i作为值传入map中
findIndex[arr[i]] = i;
}
scanf("%d", &m);
for (int i = 0; i < m; ++i) {
int findNum;//待查找元素
scanf("%d", &findNum);
//find函数会返回找到的元素的迭代器
if (findIndex.find(findNum) == findIndex.end()) {
//迭代后为后尾指针,说明findNum不在数组中
printf("NO\n");
}else {
printf("YES\n");
}
}
}
return 0;
}