• 排序算法练习及应用..


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Alpha.622 2024-05-23 08:36 采纳率: 40% 浏览 7 首页/ 编程语言 / 排序算法练习及应用.. c语言数据结构排序算法有问必答 (1)一组学生信息包括:学号(int型),姓名(字符串),成绩(float型),这组学生信息输入时按学号从小到大排序,请在这组学生信息中查找指定学号的学生的信息(输出该学号学生的姓名和成绩)。要求:1.分别使用带监视哨的顺序查找和折半查找完成题目要求。2.两个算法分别给出 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 阿里嘎多学长 2024-05-23 08:36
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      基于您提供的信息,以下是解决这个问题的具体步骤:

      1. 定义学生信息结构体:首先,您需要定义一个结构体Student来存储学生的学号、姓名和成绩。

      2. 输入学生信息:由于学号已经按从小到大排序,您可以直接从用户那里获取学生信息,并存储到一个Student类型的数组中。

      3. 实现带监视哨的顺序查找

        • 将数组的最后一个元素之后添加一个哨兵元素,该元素的学号设置为一个不可能的值(例如:-1)。
        • 从数组的第二个元素开始(因为第一个元素后是哨兵),逐个与目标学号进行比较,直到找到匹配的学号或遍历到哨兵元素。
      4. 实现折半查找

        • 由于学号已经排序,您可以使用折半查找算法。
        • 初始化左右指针,左边界为0,右边界为数组长度减1。
        • 计算中间索引,并检查中间元素的学号是否等于目标学号。
        • 如果等于,返回中间索引;如果目标学号小于中间元素的学号,更新右边界为中间索引减1;如果大于,更新左边界为中间索引加1。
        • 重复这个过程直到找到目标学号或左右指针相遇。
      5. 编写查找函数:为两种查找方法分别编写函数,接受学生数组、数组长度和目标学号作为参数,并返回找到的学生的索引。

      6. 输出学生信息:在主函数中,根据用户输入的学号调用相应的查找函数。如果找到了学生,使用返回的索引打印学生的姓名和成绩;如果没有找到,输出相应的提示信息。

      7. 测试代码:编写测试用例,确保您的代码能够正确地找到学生信息,并且在学号不存在的情况下能够给出正确的提示。

      8. 优化和调试:根据测试结果对代码进行必要的优化和调试。

      9. 编写注释:在代码中添加必要的注释,说明每个函数和重要代码段的功能。

      10. 代码示例:以下是根据上述步骤编写的代码示例:

      #include 
      #include 
      #include 
      
      typedef struct {
          int id;
          char name[50];
          float score;
      } Student;
      
      // 带监视哨的顺序查找函数
      int sequentialSearchWithSentinel(Student students[], int n, int targetId) {
          Student sentinel = {-1, "", -1.0};
          students[n] = sentinel; // 添加监视哨
          for (int i = 0; i < n; i++) {
              if (students[i].id == targetId) {
                  return i;
              }
          }
          return -1; // 未找到
      }
      
      // 折半查找函数
      int binarySearch(Student students[], int n, int targetId) {
          int left = 0, right = n - 1;
          while (left <= right) {
              int mid = left + (right - left) / 2;
              if (students[mid].id == targetId) {
                  return mid;
              } else if (students[mid].id < targetId) {
                  left = mid + 1;
              } else {
                  right = mid - 1;
              }
          }
          return -1; // 未找到
      }
      
      int main() {
          int n, searchId;
          printf("Enter the number of students: ");
          scanf("%d", &n);
      
          Student students[n];
          printf("Enter student information (ID, Name, Score):\n");
          for (int i = 0; i < n; i++) {
              scanf("%d %s %f", &students[i].id, students[i].name, &students[i].score);
          }
      
          printf("Enter the student ID to search: ");
          scanf("%d", &searchId);
      
          int indexWithSentinel = sequentialSearchWithSentinel(students, n - 1, searchId);
          if (indexWithSentinel != -1) {
              printf("Student found with sentinel: ID = %d, Name = %s, Score = %.2f\n",
                     students[indexWithSentinel].id, students[indexWithSentinel].name, students[indexWithSentinel].score);
          }
      
          int indexBinarySearch = binarySearch(students, n - 1, searchId);
          if (indexBinarySearch != -1) {
              printf("Student found with binary search: ID = %d, Name = %s, Score = %.2f\n",
                     students[indexBinarySearch].id, students[indexBinarySearch].name, students[indexBinarySearch].score);
          }
      
          return 0;
      }
      

      请注意,这段代码需要在实际环境中编译和运行,以确保其正确性。同时,您可能需要根据实际情况调整输入和输出的格式。

      展开全部

      评论 编辑记录
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-23 08:36
      关注

      引自免费微信小程序:皆我百晓生

      首先,我们先定义一个结构体来表示学生信息:

      #include 
      #include 
      
      #define MAX_NAME_LENGTH 50
      
      typedef struct {
          int id;
          char name[MAX_NAME_LENGTH];
          float grade;
      } Student;
      

      接下来,我们将实现带监视哨的顺序查找算法。在顺序查找过程中,我们需要遍历整个数组,同时设置一个监视哨变量,用于记录当前已经检查过的最大值。当找到目标学号时,返回其索引;若超过监视哨值,则表明没有找到目标学号。

      int sequential_search_with_guard(Student *students, int num_students, int target_id) {
          int i, guard = -1; // 初始化监视哨为负数,表示未开始搜索
          for (i = 0; i < num_students; i++) {
              if (students[i].id == target_id) {
                  return i; // 找到了目标学号,返回索引
              }
              if (students[i].id > target_id && guard == -1) { // 更新监视哨
                  guard = i;
              }
          }
          return guard; // 如果没找到,返回监视哨的位置,后续元素不可能包含目标学号
      }
      

      然后,我们实现折半查找算法。这个算法需要确保数据是有序的,这里假定输入的学生信息已经按照学号升序排列。从中间元素开始比较,如果目标学号小于中间元素,则在左半部分递归查找,否则在右半部分查找,直到找到目标学号或确定不存在。

      int binary_search(Student *students, int low, int high, int target_id) {
          if (low <= high) {
              int mid = low + (high - low) / 2;
      
              if (students[mid].id == target_id) {
                  return mid; // 找到了目标学号,返回索引
              } else if (students[mid].id < target_id) {
                  return binary_search(students, mid + 1, high, target_id); // 在右半部分查找
              } else {
                  return binary_search(students, low, mid - 1, target_id); // 在左半部分查找
              }
          }
          return -1; // 没有找到目标学号,返回-1
      }
      

      最后,在主函数中,我们可以调用这两个函数并输出结果:

      int main() {
          #define NUM_STUDENTS 5 // 假设总共有5个学生
          Student students[NUM_STUDENTS] = {{1, "Alice", 85.0},
                                            {2, "Bob", 90.0},
                                            {3, "Charlie", 78.0},
                                            {4, "David", 92.0},
                                            {5, "Eve", 88.0}};
          
          int target_id = 3; // 要查找的目标学号
      
          int sequential_index = sequential_search_with_guard(students, NUM_STUDENTS, target_id);
          if (sequential_index != -1) {
              printf("Sequential Search: ID %d, Name: %s, Grade: %.2f\n",
                     students[sequential_index].id,
                     students[sequential_index].name,
                     students[sequential_index].grade);
          } else {
              printf("Sequential Search: Not found.\n");
          }
      
          int binary_index = binary_search(students, 0, NUM_STUDENTS - 1, target_id);
          if (binary_index != -1) {
              printf("Binary Search: ID %d, Name: %s, Grade: %.2f\n",
                     students[binary_index].id,
                     students[binary_index].name,
                     students[binary_index].grade);
          } else {
              printf("Binary Search: Not found.\n");
          }
      
          return 0;
      }
      

      这段代码会根据给定的学生信息数组,通过顺序查找和折半查找方法寻找指定学号的学生信息,并输出结果。注意,实际项目中可能需要处理输入和错误情况,这里为了简化示例,只给出了静态数据。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 2024-05-23 08:37
      关注

      上午好☀️☀️☀️️
      本答案参考ChatGPT-3.5

      问题:如何使用带监视哨的顺序查找和折半查找完成题目要求?

      解决方案:

      1.使用带监视哨的顺序查找

      • 原理:从头到尾遍历数组,使用一个哨兵元素作为数组的第一个元素,若查找值在数组中,必定会在某一次比较时发现,若遍历完整个数组,仍未找到,则为未找到。

      • 代码实现:

      void SeqSearch(int a[], int n, int key)
      {
          int i;
          a[0] = key;  // 设定哨兵
          for (i = n; a[i] != key; i--);
          if (i > 0)
              printf("姓名:%s,成绩:%f", name[i-1], score[i-1]); //找到了,输出对应姓名和成绩
          else
              printf("未找到该学生!"); //未找到
      }
      

      2.折半查找

      • 原理:先对数据进行排序,再根据折半的方法逐步缩小范围,最终确定查找值是否存在。

      • 代码实现:

      void BinarySearch(int a[], int n, int key)
      {
          int left, right, middle;
          left = 0;
          right = n - 1;
          while (left <= right)
          {
              middle = (left + right) / 2;
              if (key > a[middle])
                  left = middle + 1;
              else if (key < a[middle])
                  right = middle - 1;
              else
              {
                  printf("姓名:%s,成绩:%f", name[middle], score[middle]); //找到了,输出对应姓名和成绩
                  return;
              }
          }
          printf("未找到该学生!"); //未找到
      }
      

      注意:以上两个算法都需要在输入数据时先按照学号从小到大进行排序。

      展开全部

      评论
    • 专家-百锦再@新空间代码工作室 全栈领域优质创作者 2024-05-23 08:46
      关注

      #include <
      stdio.h>
      #include <
      string.h>

      typedef struct {int id;
      char name[20];
      float score;
      } Student;

      // 带监视哨的顺序查找void sequentialSearch(Student stu[], int n, int target_id) {int i = 0;
      stu[n].id = target_id;
      // 设置监视哨while (stu[i].id != target_id) {i++;
      }if (i <
      n) {printf("
      姓名:%s,成绩:%f "
      , stu[i].name, stu[i].score);
      } else {printf("
      未找到该学生信息 "
      );
      }}
      // 折半查找void binarySearch(Student stu[], int n, int target_id) {int low = 0, high = n - 1, mid;
      while (low <
      = high) {mid = (low + high) / 2;
      if (stu[mid].id == target_id) {printf("
      姓名:%s,成绩:%f "
      , stu[mid].name, stu[mid].score);
      return;
      } else if (stu[mid].id <
      target_id) {low = mid + 1;
      } else {high = mid - 1;
      }}printf("
      未找到该学生信息 "
      );
      }
      int main() {Student students[] = {{123, "
      Alice"
      , 89.5},{234, "
      Bob"
      , 76.2},{345, "
      Cathy"
      , 92.0},{456, "
      David"
      , 85.3},{567, "
      Emma"
      , 78.6}};

      int n = sizeof(students) / sizeof(students[0]);
      int target_id = 345;

      // 带监视哨的顺序查找printf("
      带监视哨的顺序查找: "
      );
      sequentialSearch(students, n, target_id);

      // 折半查找printf("
      折半查找: "
      );
      binarySearch(students, n, target_id);

      return 0;
      }

      带监视哨的顺序查找是在待查找序列的末尾设置一个监视哨,可以减少判断条件进入循环的次数,提高查找效率。折半查找是将待查找序列逐渐缩小为两半,每次比较减少一半的数据量,适用于有序的数据集合。


      有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    使用SpringBoot整合redis多主多从集群
    Java常见API---split()
    70B大模型训练秘方① :数据集创建与评估
    京东二面:Redis为什么快?我说Redis是纯内存访问的,然后他对我笑了笑。。。。。。
    solidworks动画制作教程——装配体爆炸动画
    jenkins 2.346.1 从git拉取后自动构建部署springboot maven项目
    TSA优化算法——模仿航海过程中外套的喷气推进和蜂群行为(Matlab代码实现)
    【23种设计模式】组合模式(八)
    A-Level经济真题每期一练(54)
    G1D10-APT论文(综述应用部分)
  • 原文地址:https://ask.csdn.net/questions/8107916