排序问题
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。
输入
输入数据有一行,包含10个整数,用空格分开。
输出
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。
示例输入
1 2 3 5 4 6 8 9 10 7
示例输出
1 2 3 4 5 6 7 8 9 10 1 2 3 5 4 6 10 7 8 9
源码(用结构体):
#include <stdio.h>
struct data
{
int n;//数值
int cur;//位置
};
int main()
{
struct data arr[10];//C语言中必须用要写struct。。不然GCC是不会通过的。。
struct data t;
int i,j;
for(i=0; i<10; i++)
{
scanf("%d",&arr[i]);//输入数值
arr[i].cur=i+1;//保持位置序号
}
for(i=0; i<10-1; i++)
{
for(j=0; j<10-i-1; j++)
{
if(arr[j].n > arr[j+1].n)
{
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
for(i=0; i<10; i++)
{
if( i != 0 )
printf(" %d",arr[i].n);
else
printf("%d",arr[i].n);
}
putchar('\n');
for(i=0; i<10; i++)
{
if(i != 0)
printf(" %d",arr[i].cur);
else
printf("%d",arr[i].cur);
}
putchar('\n');
return 0;
}
或者(用两个数组):
#include <stdio.h>
int main()
{
int arr1[10],arr2[10];//arr1[10]用来存储数值,arr2[10]用来存储位置
int t;
int i,j;
for(i=0; i<10; i++)
{
scanf("%d",&arr1[i]);//输入数值
arr2[i]=i+1;//保持位置序号
}
for(i=0; i<10-1; i++)//冒泡
{
for(j=0; j<10-i-1; j++)
{
if(arr1[j] > arr1[j+1])
{
t=arr1[j];
arr1[j]=arr1[j+1];
arr1[j+1]=t;
t=arr2[j];
arr2[j]=arr2[j+1];
arr2[j+1]=t;
}
}
}
for(i=0; i<10; i++)//输出
{
if( i != 0 )//AC对输出格式好像非常严格。。。
printf(" %d",arr1[i]);
else
printf("%d",arr1[i]);
}
putchar('\n');
for(i=0; i<10; i++)
{
if(i != 0)
printf(" %d",arr2[i]);
else
printf("%d",arr2[i]);
}
putchar('\n');
return 0;
}