排序算法pascal
2.车厢重组(carry.pas)【问题描述】在一个就是火车站旁有一座桥,其桥面可以绕河中心的桥墩水平旋转。该车站职工发现桥的长度最多只能容纳两节车厢,如果将桥旋转180...
2.车厢重组(carry.pas)
【问题描述】
在一个就是火车站旁有一座桥,其桥面可以绕河中心的桥墩水平旋转。该车站职工发现桥的长度最多只能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。在他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排好序。
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
否则按输出错误处理,不能得分。 展开
【问题描述】
在一个就是火车站旁有一座桥,其桥面可以绕河中心的桥墩水平旋转。该车站职工发现桥的长度最多只能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。在他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排好序。
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
否则按输出错误处理,不能得分。 展开
4个回答
展开全部
这题我前不久做过,用冒泡排序就能解决了,不信你编一个试一试。
思想,就是按照先序或者后序,将最小的放在最左边,不用管途中的任何情况,然后就移动次小的,再移动更小的,直到将倒数第二个移动到位后,最后一个也移好了。
所以,可以将这种思想看成是冒泡排序的一个变形把。
代码很简单,就不给了,如果你实在编起困难,再说把,我觉得思想比代码更重要,代码能力可以做题实现,但是思想必须自己体会了。
奖学金
program a1(input,output);
var
n,x,y,z,i,j:integer;
a:array[1..300,1..3] of integer;
procedure swap(var a,b:integer); {交换过程}
var
s:integer;
begin
s:=a;
a:=b;
b:=s;
end;
begin
readln(n);
for i:=1 to n do
begin
readln(x,y,z);
a[i,1]:=i;
a[i,2]:=x;
a[i,3]:=x+y+z;
end;
for i:=1 to n-1 do {选择排序}
for j:=i+1 to n do
if (a[i,3]<a[j,3]) or ((a[i,3]=a[j,3]) and (a[i,2]<a[j,2])) or ((a[i,1]>a[j,1]) and (a[i,3]=a[j,3]) and (a[i,2]=a[j,2])) then
begin
swap(a[i,1],a[j,1]);
swap(a[i,2],a[j,2]);
swap(a[i,3],a[j,3]);
end;
for i:=1 to 5 do
writeln(a[i,1],' ',a[i,3]);
end.
思想,就是按照先序或者后序,将最小的放在最左边,不用管途中的任何情况,然后就移动次小的,再移动更小的,直到将倒数第二个移动到位后,最后一个也移好了。
所以,可以将这种思想看成是冒泡排序的一个变形把。
代码很简单,就不给了,如果你实在编起困难,再说把,我觉得思想比代码更重要,代码能力可以做题实现,但是思想必须自己体会了。
奖学金
program a1(input,output);
var
n,x,y,z,i,j:integer;
a:array[1..300,1..3] of integer;
procedure swap(var a,b:integer); {交换过程}
var
s:integer;
begin
s:=a;
a:=b;
b:=s;
end;
begin
readln(n);
for i:=1 to n do
begin
readln(x,y,z);
a[i,1]:=i;
a[i,2]:=x;
a[i,3]:=x+y+z;
end;
for i:=1 to n-1 do {选择排序}
for j:=i+1 to n do
if (a[i,3]<a[j,3]) or ((a[i,3]=a[j,3]) and (a[i,2]<a[j,2])) or ((a[i,1]>a[j,1]) and (a[i,3]=a[j,3]) and (a[i,2]=a[j,2])) then
begin
swap(a[i,1],a[j,1]);
swap(a[i,2],a[j,2]);
swap(a[i,3],a[j,3]);
end;
for i:=1 to 5 do
writeln(a[i,1],' ',a[i,3]);
end.
展开全部
插入排序的基本思想是将待排序的记录按照其关键字值的大小插入到已排好序的有序表的适当位置,知道全部插完为止。
以下是完成插入排序的算法:
(1):首先虚设一个记录a0,存放我们要插入的记录r(r=a0,a1,a2...,aN)。
(2):在排序的序列中找到r的插入位置。
(3):把r插到相应的位置。
参考程序如下:(以十个数为例);
program insert(input,output);
const n=10;
var
a:araay[0..n] of integer;
i,j,r:integer;
write('input data:');
for i:=1 to n do read(a[i]);
writeln;
for i:=2 to n do
begin
r:=a[i];a[0]:=r;j:=i-1;
while r<a[j] do
begin
a[j+1]:=a[j];
j;=j-1;
end;
a[j+1]:=r;
end;
write('output data:');
for i:=1 to n write(a[i]:7);
writeln;
end.
以下是完成插入排序的算法:
(1):首先虚设一个记录a0,存放我们要插入的记录r(r=a0,a1,a2...,aN)。
(2):在排序的序列中找到r的插入位置。
(3):把r插到相应的位置。
参考程序如下:(以十个数为例);
program insert(input,output);
const n=10;
var
a:araay[0..n] of integer;
i,j,r:integer;
write('input data:');
for i:=1 to n do read(a[i]);
writeln;
for i:=2 to n do
begin
r:=a[i];a[0]:=r;j:=i-1;
while r<a[j] do
begin
a[j+1]:=a[j];
j;=j-1;
end;
a[j+1]:=r;
end;
write('output data:');
for i:=1 to n write(a[i]:7);
writeln;
end.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一题:
Program sswwaapp;
Var
a:array[0..10001] of longint;
n,i,j,k,ans:longint;
Begin
readln(n);
for i:=1 to n do
read(a[i]);
for i:=1 to n do
for j:=1 to n-1 do
if a[j]>a[j+1] then
begin
k:=a[j];
a[j]:=a[j+1];
a[j+1]:=k;
inc(ans);
end;
writeln(ans);
End.
第二题网上非常好找。
Program sswwaapp;
Var
a:array[0..10001] of longint;
n,i,j,k,ans:longint;
Begin
readln(n);
for i:=1 to n do
read(a[i]);
for i:=1 to n do
for j:=1 to n-1 do
if a[j]>a[j+1] then
begin
k:=a[j];
a[j]:=a[j+1];
a[j+1]:=k;
inc(ans);
end;
writeln(ans);
End.
第二题网上非常好找。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
无语
没数据范围吗?那就冒泡吧,就两行代码
没数据范围吗?那就冒泡吧,就两行代码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询