- 1、本文档共70页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2、排序思想与其应用
排序思想及其应用 排序问题 输入n个数a1,a2,…,an,设计一个有效的排序算法,产生输入序列的一个重排a1’,a2’,…,an’,使得a1’≤ a2’≤…≤an’(或a1’≥ a2’ ≥ … ≥ an’)。 顺序统计学建立在排序知识基础之上的。在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。 排序问题的分类 1、显性排序问题 2、隐性排序问题 显性排序问题 1、输入序列通常是一个有n个元素的数组。 2、如果待排序的对象不是单一数据而是一个记录的话,则排序依据其中的关键字域key(整数、实数、字符串等)进行。关键字域key可能有多个,但必须明确第一关键字、第二关键字、¨的优先顺序。对两个对象而言,如果第一关键字的值相等,则比较第二关键字,依次类推,关键字值大的对象为大者。 奖学金 【问题描述】 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。 【输入】 输入文件scholar.in包含n+1行:第1行为一个正整数n,表示该校参加评选的学生人数。第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间z第1行的3个数 字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。所给的数据都是正确的,不必检验。 【输出】 输出文件scholar.out共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。 确定关键字的优先顺序 第1关键字:总分 第2关键字:语文成绩 第3关键字:学号 递增排列。即先按总分从高到低排序;如果两个同学总分相同,再按语文成绩从高到低排序;如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 计算方法 1、在输入每个同学语文、数学、英语成绩的同时,按照输入顺序设置学号,统计每个学生的总分。 2、按照总分为第1关键字、语文成绩为第2关键字、学号为第3关键字的递增顺序排列n个学生。 3、输出前5名学生的总分和学号。 由于学生数n的上限为300,因此采用O(n2)的泡沫排序也无妨. 按照关键字的优先顺序比较大小 Function Comp(a1,s1,p1,a2,s2,p2:Integer):Boolean;{两个学生的总分、语文成绩、学号分别为(s1,a1,p1)和(s2,a2,p2)。按照总分为第1关键字、语文成绩为第2关键字、学号为第3关键字的顺序比较大小} Begin if s1s2 then exit(true);{比较总分} if s1s2 then exit(false); if a1a2 then exit(true);{在总分相同的情况下比较语文成绩} if a1a2 then exit(false); if p1p2 then exit(true);{在总分和语文成绩的情况下比较学号} if p1p2 then exit(false); exit(false);{ 两个学生的总分、语文成绩、学号相同} End; 初始化 read(n);{读该校参加评选的学生人数} for i:=1 to n do begin p[i]:=i;{设置第i个学生的学号} read(a[i],b[i],c[i]);{读第i个学生的语文、数学、英语的成绩} s[i]:=a[i]+b[i]+c[i];{统计第i个学生的总分} end; 排序和输出 for i:=1 to n-1 do for j:=i+1 to n do if comp(a[j],s
文档评论(0)