MOOC清华《程序设计基础》第4章第2题:最高分与最低分(用复合型折半插入排序法做)

来源:互联网 发布:天天秒淘宝秒杀助手 编辑:程序博客网 时间:2024/05/17 03:31

题目描述

清华附小期末考试结束后,分别由数学、语文、英语按照学号顺序输入30名同学的成绩,班主任想知道三门课总分的最高分和最低分,以及取得总分最高分和最低分的两位同学的编号。(输入数据保证没有同分情况,编号由1到30)

输入描述

第一行输入编号为1-30的30位同学的数学成绩,分数之间用空格隔开;第二行输入语文成绩,第三行输入英语成绩

输出描述

输出四个数,分别是总分最高分,总分最低分,取得最高分同学的编号,取得最低分同学的编号

样例输入

  100 99 99 99 99 ... 98 97 90 60  100 98 97 96 95 ... 97 96 98 60  100 90 90 90 90 ... 96 95 94 60
样例输出

300 180 1 30

#include <iostream>using namespace std;#define N 30int main(){int Math[N] = {0}, Chinese[N] = {0}, English[N] = {0}, Total[N] = {0}, Number[N] = {0};for(int i = 0; i < N; i++)cin >> Math[i];                //输入数学成绩 for(int i = 0; i < N; i++)cin >> Chinese[i];             //输入语文成绩 for(int i = 0; i < N; i++)cin >> English[i];             //输入英语成绩 for(int i = 0; i < N; i++)Total[i] = Math[i] + Chinese[i] + English[i];        //计算总分 for(int i = 0; i < N; i++)Number[i] = i + 1;             //生成序号 void BinaryInsectionSort_Complex(int a[], int b[], int n);BinaryInsectionSort_Complex(Total, Number, N);cout << Total[N - 1] << ' ' << Total[0] << ' ' << Number[N - 1] << ' ' << Number[0];return 0;}void BinaryInsectionSort_Complex(int a[], int b[], int n)  {      for(int i = 1; i < n; i++)      {          int target = a[i], attach = b[i];          int low = 0, high = i - 1, id = -1;          while (low <= high)          {              int middle = (low + high) / 2;              if(a[middle] >= target)                  high = middle - 1;              else                  low = middle + 1;            }          id = high + 1;          if(id != -1)          {              for(int j = i; j > id; j--)                {a[j] = a[j - 1];b[j] = b[j - 1];}                    a[id] = target;b[id] = attach;           }       }  }  

在上述代码中,最主要的技巧是:一,宏定义与数组下标的灵活关系;二,复合型折半插入排序函数中,按 a[i] 从小到大排序,同时 b[i] 也作为 a[i] 的相关数组参与排序,这样就保证了两个数组的对应关系没有被破坏,这与Windows磁盘系统中文件按不同指标排序是同样的思想。


阅读全文
0 0
原创粉丝点击