数据结构作业三

本文提供了五个关于计算机科学基础算法的问题,包括无向图的深度优先搜索实现、最小堆的构建及下沉操作、折半查找的次数计算、排序算法的应用以及基于unordered_map的查询系统,展示了数据结构和算法在实际问题中的应用。
摘要由CSDN通过智能技术生成

目录

问题 A: 无向图的深度优先搜索

 问题 B: 最小堆的形成

问题 C: 折半查找的次数

 问题 D: N个数的排序

 问题 E: 班级同学信息查询

问题 A: 无向图的深度优先搜索

输入

第一行是整数m和n(1<m,n<100),分别代表顶点数和边数。后边n行,每行2个数,分别表示一个边的两个顶点。

输出

该图从0号顶点开始的深度优先搜索序列。

样例输入 复制
5 5
0 1
2 0
1 3
1 4
4 2
样例输出 复制
0 1 3 4 2
#include<bits/stdc++.h>
using namespace std;
int mp[101][101];
bool f[101]={0};
int i,n,m; 
void dfs(int x)
{
    cout<<x<<" ";
    for(int i=1;i<=m;i++)
    {
        if(mp[x][i]&&f[i]==0)
        {
            f[i]=1;
            dfs(i);
              
        }
    }
}
int main()
{
//  int m,n;
    cin>>m>>n;
    int a,b;
    for(int i=1;i<=n;i++)
    {
        cin>>a>>b;
        mp[a][b]=1;
        mp[b][a]=1;
    }
    dfs(0);
}

 问题 B: 最小堆的形成

题目描述

现在给你n个结点的完全二叉树数组存储序列,请编程调整为最小堆,并输出相应最小堆的存储序列。

输入

第一行是n,第二行是n个结点的完全二叉树数组存储序列。

输出

输出相应最小堆的存储序列。

样例输入 复制
8
53 17 78 23 45 65 87 9
样例输出 复制
9 17 65 23 45 78 87 53
#include <iostream>
#include <vector>
using namespace std;
 
// 堆节点下沉操作
void downAdjust(vector<int>& arr, int parent, int length) {
    int child = parent * 2 + 1; // 左孩子节点
    while (child < length) {
        if (child + 1 < length && arr[child + 1] < arr[child]) {
            child++; // 选择左右节点中较小的一个
        }
        if (arr[parent] <= arr[child]) break;
        swap(arr[parent], arr[child]);
        parent = child;
        child = parent * 2 + 1;
    }
}
 
// 构建最小堆
void buildMinHeap(vector<int>& arr) {
    for (int i = (arr.size() - 2) / 2; i >= 0; i--) {
        downAdjust(arr, i, arr.size());
    }
}
 
int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
 
    buildMinHeap(arr);
   
   // 输出最小堆序列
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
   
   return 0;
}

问题 C: 折半查找的次数

题目描述

给你一个无重复数的有序序列,如果采用折半查找的方式,对于给定的数,需要比较几次找到,请编程实现。

输入

第一行是N,表示序列中数的个数,序列最长1000,第二行是一个有序序列,第三行是要找的数x。

输出

如果找到x,输出折半比较的次数,否则输出NO。

样例输入 复制
11
5 13 19 21 37 56 64 75 80 88 92
19
样例输出 复制
2
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1001];
int f(int x)
{
    int t=n,m=0,r=1,sum=0,f=0;
    while(t>=r)
    {
        m=((t-r)/2)+r;
        if(a[m]>x)
        {
            t=m-1;
            if(t!=r)
            sum++;
        }
        else if(a[m]<x){
          
            r=m+1;
            if(t!=r)
            sum++;
        }
        else{
            sum++;
            return sum;
        }
    }
    return -1;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int x,p=0;
    cin>>x;
    p=f(x);
    if(p==-1) cout<<"NO";
    else    cout<<p;
}

 问题 D: N个数的排序

题目描述

给你N个自然数,编程输出排序后的这N个数。

输入

第一行是整数的个数N(N<=100)。第二行是用空格隔开的N个数。

输出

排序输出N个数,每个数间用一个空格间隔。

样例输入 复制
5
9 6 8 7 5
样例输出 复制
5 6 7 8 9
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,a[100];
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);   //使用sort函数排序
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    return 0;
}

 问题 E: 班级同学信息查询

题目描述

班级里有N个同学,老师希望你编个程序,把每个同学的学号、姓名、座位号保存下来,然后每次要查同学信息时,直接输入相应同学的学号,即可输出该同学的姓名和座位号。

输入

第一行为整数N(N<100),表示班里同学的人数。接下来N行,每行分别是每个同学的学号、姓名和座位号,最后一行是要查询的同学的学号。

输出

输出查询同学的姓名和座位号。

样例输入 复制
3
1 zhang 11
2 wang 22
3 li 33
2
样例输出 复制
wang 22
#include <iostream>
#include <unordered_map>
 
using namespace std;
 
struct Student {
    string name;
    string seat;
};
 
int main() {
    int n;
    cin >> n;
 
    unordered_map<int, Student> studentMap; // 使用unordered_map存储学生信息
 
    for (int i = 0; i < n; i++) {
        int id;
        string name;
        string seat;
        cin >> id >> name >> seat;
        studentMap[id] = {name, seat}; // 将学生信息存储到unordered_map中
    }
 
    int queryId;
    cin >> queryId; // 输入要查询的学生学号
 
    if (studentMap.count(queryId)) {
        Student student = studentMap[queryId];
        cout << student.name << " " << student.seat << endl;
    } else {
        cout << "学生不存在" << endl;
    }
 
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值