西南科技大学
ACM解题报告
姓名:张艺童
学号:5120142109
组号:3
班级:软件1402
1 题目来源:OJ 0616
2 题目描述:
Description:
用选择法对N个学生的成绩按从大到小的顺序排序,N个学生的成绩整数用scanf 输入,输入的成绩在[0,100]之间。排序完成后,输入一个成绩,要求用逐个比较查找的方式找出该成绩是该组中第几个元素的值(即第几名)。如果该成绩不在数组中,则输出“no this score!”。 要求: 1、把排序算法写成函数形式,在主函数中输入N个数据,然后调用排序函数排序。 2、在排序过程中尽量减少数据的交换和移动。 3、把查找算法写成函数形式,在主函数中输入1个数
Input:
输入共有三行:第一行是一个数N(N < 50),表示学生的人数; 第二行输入N个学生的成绩; 第三行输入一个数m(你要查找的成绩)
Otput:
第一行输出N个已经排好序的成绩,每两个成绩之间有一个空格隔开,每10个数据换一行(由大到小排列)。 第二行输出你要查找的成绩的名次(如果成绩相同,则并列)。具体的见Sample Output。
Sample iutput
1 2 3 4 5 6 7 |
15 23 32 43 54 65 65 78 87 98 87 76 76 76 55 65 87 23 32 43 54 89 89 78 89 78 55 65 76 87 87 87 65 65 89 86 65 78 54 57 54 86 |
Sample Onput
1 2 3 4 5 6 7 8 |
98 87 87 78 76 76 76 65 65 65 55 54 43 32 23 2 89 89 89 89 87 87 87 86 78 78 78 76 65 65 65 65 57 55 54 54 54 43 32 8 |
3 题目分析及知识点:
选择排序的正确使用,因为成绩可能会有几个人有相同成绩的情况,所以用二分查找是极有可能出错的,我选择了从数组的首元素开始比对查找的方式。这样会比较满足题目的要求。
4 AC源代码:
#include<stdio.h>
int main()
{
void select_sort(int a[],int n);
int find(int b[],int n,int key);
int n,a[50],m,s;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
select_sort(a,n);
for(int j=0;j<n-1;j++)
{
printf("%d",a[j]);
if((j+1)%10==0)
{
printf("\n");
}
else
printf(" ");
}
printf("%d\n",a[n-1]);
s=find(a,n,m);
if(s>0)
printf("%d\n",s);
else
printf("no this score!\n");
return 0;
}
void select_sort(int a[],int n)
{
register int i,j,max,t;
for(i=0;i<n-1;i++)
{
max=i;
for(j=i+1;j<n;j++)
if(a[max]<a[j])
max=j;
if(max!=i)
{
t=a[max];
a[max]=a[i];
a[i]=t;
}
}
}
int find(int b[],int n,int key)
{
int g,k;
for( k=0;k<n;k++)
{
if(b[k]==key) break;
}
if(k<n-1)
g= k+1;
else
{
if (b[k]==key)
g= k+1;
else
g= -1;
}
return (g);
}
5 做题心得:
开始出现的问题就是用来二分查找,忽视了其他情况的出现,自己的运行都不对。
后来用另一种方式来查找之后,可解决这个问题。从这道题里我学会的是考虑所采用方法不可避免的弊端,是否与题目的要求冲突。如果冲突就要采取其他的方式。