计算机考研机试指南第二版(王道)——第三章 排序和查找

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值