题目描述
军方截获的信息由n(n<=30000)个数字组成,因为是敌国的高端秘密,所以一时不能破获。最原始的想法就是对这n个数进行小到大排序,每个数都对应一个序号,然后对第i个是什么数感兴趣,现在要求编程完成。
输入
第一行n,接着是n个截获的数字,接着一行是数字k,接着是k行要输出数的序号。
输出
k行序号对应的数字。
样例输入
5
121 1 126 123 7
3
2
4
3
样例输出
7
123
121
这个题主要考排序,不过数据太大,对时间有要求,对于插入,选择,冒泡这三种排序,插入效率最高,选择其次,冒泡最低,提交之后,选择,冒泡时间超限10%,插入排序ac了,所以仅仅掌握一种排序方式是不够的,下面是插入,选择,冒泡三种方式的代码
#include<stdio.h>//插入排序
int main()
{
int n,i,j,k,t,a[31000],x,m;
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&a[0]);
t=1;
for(i=1;i<n;i++)
{
scanf("%d",&x);//依次输入
for(j=0;j<t;j++)
{
if(x<a[j])
{
break;//找到比a[i]大的第一个数
}
}
for(k=t;k>j;k--)
{
a[k]=a[k-1];//依次后移
}
a[j]=x;
t++;
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&x);
printf("%d\n",a[x-1]);
}
}
return 0;
}
#include<stdio.h>//选择排序
int main()
{
int n,i,j,a[30000],t,x,k;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i],a[i]=a[j],a[j]=t;
}
}
}
scanf("%d",&x);
for(i=1;i<=x;i++)
{
scanf("%d",&k);
printf("%d\n",a[k-1]);
}
}
return 0;
}
#include<stdio.h>
int main()//冒泡排序
{
int n,i,j,a[31000],t,x,k;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)//,i控制趟数,n个数排序,需要进行n-1趟
{
for(j=0;j<n-i-1;j++)//j控制比较次数,第i趟需要n-i次两两比较
{
if(a[j]>a[j+1])//相邻两个元素比较,从小到大排序
{
t=a[j],a[j]=a[j+1],a[j+1]=t;
}
}
}
scanf("%d",&x);
for(i=1;i<=x;i++)
{
scanf("%d",&k);
printf("%d\n",a[k-1]);
}
}
return 0;
}