Problem I: 零起点学算法89——程序设计竞赛
Description
每年5月份,省里都要举行程序设计竞赛。 为了让最优秀的学生去参加比赛,我们一般需要做一个选拔工作。 现在你来帮老师完成这个任务哦。
Input
多组测试数据,每组数据一行,该行先输入一个整数n ( n <= 30),表示参加选拔的同学人数。然后是n个整数表示选拔成绩。
Output
对于每组测试数据,请在一行从高到低输出他们的成绩。
Sample Input
4 2 6 7 1
3 4 10 9
Sample Output
7 6 2 1
10 9 4
分析:
第一步选中第一个数字,然后和余下的数分别比大小,比出最大的数,最后交换位置,将这组数的最大数就交换到了第一个。然后选中下一个重复上述行为。
逐个比较法:
#include<stdio.h>
int main(){
int i,j,k,n,m,a[100];
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(a[k]<a[j]){
k=j;
}
}
if(k!=i){
m=a[i];
a[i]=a[k];
a[k]=m;
}
}for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
冒泡排序法:
#include<stdio.h>
int main(){
int n,a[50];
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int t;
for(int i=1;i<n;i++){
int flag=0;
for(int j=0;j<n-i;j++){
if(a[j]<a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
flag=1;
}
if(flag==0) break;
}
}
for(int i=0;i<n-1;i++){
printf("%d ",a[i]);
}
printf("%d\n",a[n-1]);
}
return 0;
}